C# и интерфейсы (не GUI)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Natali Osina, 15 Jun 2011.

  1. Natali Osina

    Natali Osina New Member

    Joined:
    15 Jun 2011
    Messages:
    65
    Likes Received:
    3
    Reputations:
    0
    Всем привет.
    Я начала изучать программирование на языках .NET и остановилась на шарпе.
    Вроде бы все понятно поначалу было, НО есть одна тема которую я понять не могу.
    Это понятие интерфейса.
    Зачем он нужен, и т.д.
    Я очень много пользовалась поисковой системой но запросы либо были связаны с гуи, либо интерфейсы описаны убого, либо я сама не могу понять...
    Гугл мне показал этот сайт, и думаю мне тут помогут разобраться.
    собственно что уже знаю о интерфейсах...
    - синтаксис
    - обвертывание
    - кастинг
    - теория
    собственно что хочу узнать...
    - ребята, пожалуйста на пальчиках покажите мне как применить на практике интерфейсы. если можно пожалуйста напишите код хоть консольной программки которая без интерфейса работать просто не будет. мне нужны доказательства их пользы на практике. я уже перечитала теорию с 5 ти книг и никак не могу понять зачем они нужны и какая их польза на практике особенно.
    я никак не могу понять зачем усложнять себе жизнь интерфейсами.
    Спасибо,)
    Жду ответов :)
    ЗЫ\ опишите как можно проще, я учусь на экономиста а программированием просто со школы интересуюсь.
     
  2. Natali Osina

    Natali Osina New Member

    Joined:
    15 Jun 2011
    Messages:
    65
    Likes Received:
    3
    Reputations:
    0
    да, чуть не забыла, если у кого то на этом сайте есть хорошие книжки скиньте их мне на е-мейл
    [email protected]
    спасибки, жду ответов в теме.)
     
  3. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    фото в студию. Мнение общественности
     
    1 person likes this.
  4. Natali Osina

    Natali Osina New Member

    Joined:
    15 Jun 2011
    Messages:
    65
    Likes Received:
    3
    Reputations:
    0
    почему я вам должна показывать свои фотографии?
     
  5. HakaR

    HakaR Active Member

    Joined:
    23 Jul 2009
    Messages:
    301
    Likes Received:
    200
    Reputations:
    3
    Почему мы должны Вам помогать?
     
    1 person likes this.
  6. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Почитайте про объектно-ориентированное проектирование, в частности тему полиморфизма.
    Полиморфизм вообще это самая важная концепция в ООП. В языках по типу 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>, хотя эти объекты по своей сути достаточно разнородные.
    Мораль примера такова: не следует привязываться к конкретным реализациям(в данном случае массиву) если нам нужна функциональность только одного интерфейса.
     
  7. Natali Osina

    Natali Osina New Member

    Joined:
    15 Jun 2011
    Messages:
    65
    Likes Received:
    3
    Reputations:
    0
    HakaR, Вы мне ничего не должны. И слава Богу. Просто я нашла сайт программистов и подумала что мне тут помогут понять вопрос, который мне сам не постигается.
    Спасибо большое человеку GhostOnline :)
    Я обязательно прочту то что вы посоветовали и попробую завтра написать программку в которой постараюсь использовать интерфейс.
    Завтра отпишу.
     
  8. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    тут https://forum.antichat.ru/threadnav90173-99-10.html как-то обсуждалось. 3-й пост сверху. ;)
     
  9. Natali Osina

    Natali Osina New Member

    Joined:
    15 Jun 2011
    Messages:
    65
    Likes Received:
    3
    Reputations:
    0
    BrainDeaD спасибо за ссылку.
    В принципе теорию я поняла, так как стараясь понять об интерфейсах я прочитала не одну главу с 5-ти разных книг, но примеры, которые там приводились меня просто вводят в истерику. Все настолько прозрачно и просто, что дальше некуда, а люди начинают усложнять код интерфейсами.
    Это основная причина ) как Вам сказать, мне хочется написать программу, которая в принципе не может обойтись без интерфейса (как мне уже написали, это невозможно).
    Ну или хотя бы такую, которая наочно показала бы их преимущество.
    И еще, то, что я написала выше относилось к сообщению hakar, но оно куда то пропало..
     
  10. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    Натали, нужда в интерфейсах возникает скорее не из-за необходимости их применения, а из-за особенности поставленой задачи.

    Возьмём пример программы, использующей соединение с базами данных. Цель такой программы поддерживать соединйение с различными базами данных, как 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()) может посылать данные любой базе данных, независимо от её технических особенностей.
    Таким образом, мы можем добавлять в программу возможность работы с любой базой данных, не меняя её код. Для этого нужно лишь, что бы каждый класс соединения наследовался от интерфейса и реализовывал его члены(извините за выражение :D )

    P.S. сообщение, которое пропало, не имело отношения к теме и провоцировало флуд. Ваш(твой) ответ на него был так-же удалён.
     
  11. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    вот это понять поможет
    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);
    
     
  12. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    greki_hoy, тема как бы C#.
     
  13. Natali Osina

    Natali Osina New Member

    Joined:
    15 Jun 2011
    Messages:
    65
    Likes Received:
    3
    Reputations:
    0
    Огромное спасибо человеку BrainDeaD :)
    Я вечером попробую что то написать сама и скину то что придумаю)
    пока разбираюсь что тут к чему)
     
  14. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    Ну как, разобралась?
     
  15. Natali Osina

    Natali Osina New Member

    Joined:
    15 Jun 2011
    Messages:
    65
    Likes Received:
    3
    Reputations:
    0
    AlexTheC0d3r нет. пока не разобралась.
    Попробую сама прочитать одну книжку, которую мне скинули.
    Там в конце каждого раздела есть задание, и я попробую его выполнить.
    Потом код программки скину и может поможете мне по коду показать все прелести интерфейсов... бррр просто голова кругом..
    Завтра уже дочитаю и попробую сама написать.
    Спасибо что волнуетесь ;)