использование интерфейсов - аспект шаблона проектирования - PullRequest
4 голосов
/ 24 марта 2011

Я ищу хорошую и короткую статью + примеры работы с интерфейсами.Мне не интересна техническая часть, но мне нужна часть дизайна.Например, как программировать с использованием интерфейсов, когда и как создавать реализации, шаблоны проектирования для обычной разработки с интерфейсами.

У меня есть много похожих классов, которые повторяются несколькими способами.Я хочу использовать интерфейсы и абстрактные классы, чтобы сделать вещи более модульными - но я не могу понять, как это сделать правильно.

Ответы [ 4 ]

13 голосов
/ 24 марта 2011

Интерфейс определяет контракт.Это обещание, что объект будет вести себя определенным образом.Прежде чем изучать интерфейсы, вы склонны думать об объектах в конкретных терминах.Например, предположим, что у нас есть список продуктов:

List<string> products = new List<string>() { "desktop", "laptop", "server" };

И у нас есть метод, который распечатывает наши продукты:

void PrintProducts(List<string> products)
{
     foreach (string product in products)
     { 
          Console.WriteLine(product);
     }
}

Наш метод связан с конкретным типомСписок.Это должно быть хотя?В C # существует множество различных типов коллекций: списки, массивы, ReadOnlyCollection и т. Д. Все, что вам действительно нужно сделать, - это просмотреть их.В списке есть много методов, которых нет в массиве, но здесь вы не используете ни один из них.К счастью, все они реализуют интерфейс IEnumerable.Это означает, что все они «связаны контрактом», чтобы иметь возможность быть перечисленными.

Изменение метода следующим образом:

void PrintProducts(IEnumerable<string> products)
{
     foreach (string product in products)
     { 
          Console.WriteLine(product);
     }
}

означает, что теперь вы можете передавать массив, или список, или какой-то уникальный контейнер, который вы сами создаете.

Другой пример. Предположим, у вас есть хранилище данных:

public class DatabaseRepository
{
    public void AddProduct(Product product)
    {
        // connect to the database
        // add the product
    }
}

И у вас есть класс, которому нужна эта база данных:

public class ProductManager
{
    DatabaseRepository _repository;

    public ProductManager(DatabaseRepository repository)
    {
         _repository= repository;
    }
}

К сожалению, этот класспривязан к вашей базе данных.Что если вы решите перейти на хранение в виде XML-файла или на хранение в каком-либо облачном хранилище ключей-значений.Вам придется изменить ваш ProductManager, который сложен и подвержен ошибкам.Предположим, что вместо этого мы определили интерфейс:

public interface IRepository {
    void AddProduct(Product product);
}

Изменение нашего класса ProductManager для использования этого интерфейса вместо этого:

public class ProductManager
{
    IRepository _repository;

    public ProductManager(IRepository repository)
    {
         _repository= repository;
    }
}

означает, что независимо от того, какой это тип хранилища, мы знаемвсегда будет метод AddProduct (Товарный продукт).Теперь мы можем создать наш XML-репозиторий:

public class XMLRepository : IRepository 
{
    public void AddProduct(Product product)
    {
         // write to an XML file
    }
}

Теперь мы можем свободно передавать либо репозиторий:

ProductManager manager = new ProductManager(new DatabaseRepository())

или

ProductManager manager = new ProductManager(new XMLRepository())

и наш ProductManagerведет себя точно так же.Он совершенно не знает, что это за конкретный тип.

Это становится очень полезным, когда вы вступаете в юнит-тестирование.Инверсия управления - это то, о чем вы захотите прочитать, когда получите четкое представление о том, как работают интерфейсы.

2 голосов
/ 24 марта 2011

Эта книга является каноническим справочником по шаблонам проектирования и содержит примеры использования интерфейсов. Однако вы можете начать с еще более фундаментального уровня. Мышление в Java - вот что привело меня в объектно-ориентированное программирование, вероятно, существуют похожие названия для C #, хотя содержание книги должно быть в основном независимым от языка. Вы также можете искать онлайн-учебники по объектно-ориентированному программированию.

Редактировать : Великая книга о шаблонах, их реализации и использовании в C # - C # 3.0 Шаблоны проектирования

1 голос
/ 24 марта 2011

@ Наор, кажется, основываясь на твоем комментарии "Не кажется логичным создавать интерфейс для каждого моего класса, верно?" что лучшая книга для вас - это HEAD FIRST; РИСУНОКИ ДИЗАЙНА - это невероятный и простой способ научиться использовать шаблоны проектирования. Я впервые прочитал о них в этой книге, и это определенно изменило мое мнение !!! Прочитав это, вы сможете прочитать более сложные вещи, такие как Мартин Фаулер, Шаблоны архитектуры корпоративных приложений - которые, я считаю, точно соответствуют вашим желаниям, приложениям реальных шаблонов. Переход к GoF или M. Fowler, или к более сложным вещам, может вас расстроить или просто потерять время.

1 голос
/ 24 марта 2011

Когда использовать интерфейсы Интерфейс позволяет кому-то начинать с нуля, чтобы реализовать ваш интерфейс или внедрить ваш интерфейс в каком-то другом коде, исходное или основное назначение которого сильно отличалось от вашего интерфейса.Для них ваш интерфейс только случайный, то, что нужно добавить в их код, чтобы иметь возможность использовать ваш пакет.Недостатком является то, что каждый метод в интерфейсе должен быть публичным.Возможно, вы не захотите раскрывать все.

Когда использовать Абстрактные классы Абстрактный класс, напротив, обеспечивает большую структуру.Обычно он определяет некоторые реализации по умолчанию и предоставляет некоторые инструменты, полезные для полной реализации.Уловка в том, что код, использующий его, должен использовать ваш класс в качестве основы.Это может быть очень неудобно, если другие программисты, желающие использовать ваш пакет, уже самостоятельно разработали свою собственную иерархию классов.В Java класс может наследовать только от одного базового класса.

или прочитать это: http://mindprod.com/jgloss/interfacevsabstract.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...