Всем привет. Я начала изучать программирование на языках .NET и остановилась на шарпе. Вроде бы все понятно поначалу было, НО есть одна тема которую я понять не могу. Это понятие интерфейса. Зачем он нужен, и т.д. Я очень много пользовалась поисковой системой но запросы либо были связаны с гуи, либо интерфейсы описаны убого, либо я сама не могу понять... Гугл мне показал этот сайт, и думаю мне тут помогут разобраться. собственно что уже знаю о интерфейсах... - синтаксис - обвертывание - кастинг - теория собственно что хочу узнать... - ребята, пожалуйста на пальчиках покажите мне как применить на практике интерфейсы. если можно пожалуйста напишите код хоть консольной программки которая без интерфейса работать просто не будет. мне нужны доказательства их пользы на практике. я уже перечитала теорию с 5 ти книг и никак не могу понять зачем они нужны и какая их польза на практике особенно. я никак не могу понять зачем усложнять себе жизнь интерфейсами. Спасибо,) Жду ответов ЗЫ\ опишите как можно проще, я учусь на экономиста а программированием просто со школы интересуюсь.
да, чуть не забыла, если у кого то на этом сайте есть хорошие книжки скиньте их мне на е-мейл [email protected] спасибки, жду ответов в теме.)
Почитайте про объектно-ориентированное проектирование, в частности тему полиморфизма. Полиморфизм вообще это самая важная концепция в ООП. В языках по типу C# полиморфизм можно обеспечить либо абстрактными/виртуальными методами, либо интерфейсами. Но класс может наследовать только от одного класса, но зато от множества интерфейсов. Такой программы просто нет. Но попробую привести пример: Понадобился метод, оперируюший списком строк. Можно написать так: Code: void SomeMethod(string[] strings) а внутри метода обычный foreach: Code: foreach(var s in strings) //делаем что то со строками Все замечательно пока это необходимо только для массива. Но вот оказалось, что иногда нужно делать это и с List<string> Создавать новый метод? Отнюдь. Просто меняем сигнатуру: Code: void SomeMethod(IEnumerable<string> strings) теперь метод одинаково работает и с массивом, и с List<string>, и с Queue<string> и т.д.(и даже несложно передать туда свой класс), т.е. с любым объектом реализующим интерфейс IEnumerable<string>, хотя эти объекты по своей сути достаточно разнородные. Мораль примера такова: не следует привязываться к конкретным реализациям(в данном случае массиву) если нам нужна функциональность только одного интерфейса.
HakaR, Вы мне ничего не должны. И слава Богу. Просто я нашла сайт программистов и подумала что мне тут помогут понять вопрос, который мне сам не постигается. Спасибо большое человеку GhostOnline Я обязательно прочту то что вы посоветовали и попробую завтра написать программку в которой постараюсь использовать интерфейс. Завтра отпишу.
BrainDeaD спасибо за ссылку. В принципе теорию я поняла, так как стараясь понять об интерфейсах я прочитала не одну главу с 5-ти разных книг, но примеры, которые там приводились меня просто вводят в истерику. Все настолько прозрачно и просто, что дальше некуда, а люди начинают усложнять код интерфейсами. Это основная причина ) как Вам сказать, мне хочется написать программу, которая в принципе не может обойтись без интерфейса (как мне уже написали, это невозможно). Ну или хотя бы такую, которая наочно показала бы их преимущество. И еще, то, что я написала выше относилось к сообщению hakar, но оно куда то пропало..
Натали, нужда в интерфейсах возникает скорее не из-за необходимости их применения, а из-за особенности поставленой задачи. Возьмём пример программы, использующей соединение с базами данных. Цель такой программы поддерживать соединйение с различными базами данных, как MySql, MsSql, ORACLE etc.. Очевидно, что сединения с различными БД реализованы поразному. Вот тут и приходят на помощь интерфейсы. То есть в нашей программе мы используем интерфейс IDbConnection, который определяет, к примеру, два метода: OpenConnection() и CloseConnection(). Теперь каждый конкретный класс соединения наследуется от нашего интерфейса и реализует определённые методы посвоему. Code: public Class MySqlConnection : IDbConnection { public void OpenConnection() { //специальные действия нужные для MySql } public void CloseConnection() { //специальные действия нужные для MySql } } Code: public Class OracleConnection : IDbConnection { public void OpenConnection() { //специальные действия нужные для Oracle } public void CloseConnection() { //специальные действия нужные для Oracle } } А вот так вот это всё используется: Code: public void SendData(IDbConnection connection) { connection.OpenConnection() //здесь происходит обмен данными connection.CloseConnection() } Как видно, наша программа(в частности метод SendData()) может посылать данные любой базе данных, независимо от её технических особенностей. Таким образом, мы можем добавлять в программу возможность работы с любой базой данных, не меняя её код. Для этого нужно лишь, что бы каждый класс соединения наследовался от интерфейса и реализовывал его члены(извините за выражение ) P.S. сообщение, которое пропало, не имело отношения к теме и провоцировало флуд. Ваш(твой) ответ на него был так-же удалён.
вот это понять поможет Code: struct db_func { void(*open_conn)(db_func*); void(*close_conn)(db_func*); }; struct db_conn { db_func * vtbl; void *private_data; }; void mysql_open_conn(db_conn *db) { db->private_data = ... .... } void mysql_close_conn(db_conn *db) { db->private_data = ... .... } struct { void(*open_conn)(db_conn*); void(*close_conn)(db_conn*); } mysql_func [] = { &mysql_open_conn,&mysql_close_conn }; void oracle_open_conn(db_conn *db) { db->private_data = ... .... } void oracle_close_conn(db_conn *db) { db->private_data = ... .... } struct { void(*open_conn)(db_conn*); void(*close_conn)(db_conn*); } opracle_func[]={ &oracle_open_conn, oracle_close_conn }; struct mysql_data { }; struct oracle_data { }; db_conn * make_mysql() { p = new db_conn; p->vtbl = (db_func*)&mysql_func; p->private_data = new mysql_data; return p; } db_conn * make_oracle() { p = new db_conn; p->vtbl = (db_func*)&oracle_func; p->private_data = new oracle_data; return p; } вот эта функция дает понимание механизма "интерфейс & виртуальные функции" плюс ненадо перекомпилировать код использующий интерфейс когда измененяется реализация void send_data(db_conn *db) { db->_vtbl->open_conn(db); ... db->_vtbl->close_conn(db); } db_conn * mysql_db_obj = make_mysql(); db_conn * oracle_db_obj = make_oracle(); send_data(mysql_db_obj); send_data(oracle_db_obj);
Огромное спасибо человеку BrainDeaD Я вечером попробую что то написать сама и скину то что придумаю) пока разбираюсь что тут к чему)
AlexTheC0d3r нет. пока не разобралась. Попробую сама прочитать одну книжку, которую мне скинули. Там в конце каждого раздела есть задание, и я попробую его выполнить. Потом код программки скину и может поможете мне по коду показать все прелести интерфейсов... бррр просто голова кругом.. Завтра уже дочитаю и попробую сама написать. Спасибо что волнуетесь