Какая польза от объявления интерфейса в качестве члена класса? - PullRequest
1 голос
/ 31 октября 2011

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

    IMovable i = new IMovable(); 

Причина, по которой вы не можете этого сделать, довольно проста. Но какой смысл декларировать, например:

  protected static IMovable i;

Что я представляю в этом случае? Какая от этого польза?

Спасибо

Ответы [ 7 ]

3 голосов
/ 31 октября 2011

Поскольку вы напишите свой код, чтобы он мог использовать любую реализацию IMovable, а не только эту.

Это позволяет создавать слабосвязанную код.

2 голосов
/ 31 октября 2011

Член i может представлять любой объект, который реализует IMovable, поэтому он полезен.Вы можете назначить различные объекты i и иметь определенное поведение в зависимости от объекта.

2 голосов
/ 31 октября 2011

Вы хотите сохранить ссылку на объект, реализующий этот интерфейс, но вам все равно, что это за объект, только то, что он реализует этот интерфейс.

1 голос
/ 31 октября 2011

Как уже указывалось во многих других ответах, переменная-член i может указывать на любую реализацию IMovable.

Это не только большое преимущество с точки зрения гибкости, но и односпособ реализации ОО принципа Полиморфизм .

Томас

1 голос
/ 31 октября 2011

Интерфейс является своего рода абстракцией (контрактом) и не может быть реализован. Но если вы реализуете свой класс, то ваш:

interface IMovable {
  void DoStuff();
}

class ImplementinIMovableClass : IMovable {
  void DoStuff() { .. }
}

protected static IMovable i = new ImplementinIMovableClass();

Переменная i имеет только свойство / метод, определенные в этом интерфейсе. В таком случае это метод DoStuff();

С интерфейсным подходом вы можете использовать DependencyInjection , чтобы уменьшить количество кодов.

1 голос
/ 31 октября 2011

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

0 голосов
/ 31 октября 2011

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

Что-то вроде «средства передвижения» будет абстрактным классом;что-то вроде "2010 Toyota Prius Hatchback" будет конкретным классом.Можно иметь или управлять, либо из вышеперечисленного.С другой стороны, нельзя было бы купить «транспортное средство» как таковое - можно было бы купить конкретный тип транспортного средства.В реальной жизни человек мог бы гипотетически попросить кого-нибудь купить ему транспортное средство, не указав какой-либо конкретный вид, но в большинстве языков программирования компилятор в такой ситуации хотел бы знать, какого рода.Для создания объекта нужно будет знать, какой тип объекта он создает, но во многих случаях коду будут предоставлены объекты, созданные другим кодом.Код, который использует абстрактный класс или интерфейс для указания того, что он ожидает от другого кода, будет использоваться с другим кодом, который создает любой класс, производный от этого абстрактного класса или реализующий этот интерфейс.

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