Ссылочные переменные интерфейса - PullRequest
3 голосов
/ 30 августа 2010

Я перебираю некоторые основы ОО и пытаюсь понять, почему используются ссылочные переменные интерфейса.

Когда я создаю интерфейс:

public interface IWorker
    {
        int HoneySum { get; }

        void getHoney();
    }

и класс реализует это:

public class Worker : Bee, IWorker
    {
        int honeySum = 15;

        public int HoneySum { get { return honeySum; } }

        public void getHoney()
        {
            Console.WriteLine("Worker Bee: I have this much honey: {0}", HoneySum);
        }
    }

почему люди используют:

IWorker worker = new Worker();
            worker.getHoney();

вместо простого использования:

Worker worker3 = new Worker();
            worker3.getHoney();

Какой смысл ссылочной переменной интерфейса, когда вы можете просто установить класс и использовать его методы и поля таким образом?

Ответы [ 6 ]

5 голосов
/ 30 августа 2010

Если ваш код знает, какой класс будет использоваться, вы правы, нет смысла иметь переменную типа интерфейса. Как в вашем примере. Этот код знает , что класс, который будет создан, является Worker, , потому что этот код не будет волшебным образом изменяться и создавать что-либо еще, кроме Worker. В этом смысле ваш код связан с определением и использованием Worker.

Но вы можете написать некоторый код, который работает, не зная тип класса. Возьмем для примера следующий метод:

public void stopWorker(IWorker worker) {
    worker.stop(); // Assuming IWorker has a stop() method
}

Этот метод не заботится о конкретном классе. Он будет обрабатывать все, что реализует IWorker.

Это код, который вам не нужно менять, если позже вы захотите использовать другую реализацию IWorker.

Все дело в слабой связи между вашими частями кода. Все дело в ремонтопригодности.

0 голосов
/ 30 августа 2010

Думайте об интерфейсах как о протоколах, а не как о классах, т. Е. Реализует ли этот объект этот протокол в отличие от протокола?Например, может ли мой числовой объект быть сериализуемым?Его класс - это число, но он может реализовывать интерфейс, который описывает, в общем, как его можно сериализовать.

Данный класс объекта может фактически реализовывать много интерфейсов.

0 голосов
/ 30 августа 2010

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

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

0 голосов
/ 30 августа 2010

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

0 голосов
/ 30 августа 2010

В основном считается хорошей практикой программирования использовать интерфейс в качестве типа. Это позволяет использовать различные реализации интерфейса без влияния на код. То есть если назначенный объект был передан, то вы можете передать все, что реализует интерфейс, не влияя на класс. Однако, если вы используете конкретный класс, то можете передавать только объекты этого типа.

Существует принцип программирования, название которого я не могу вспомнить в настоящее время, который применим к этому.

0 голосов
/ 30 августа 2010

Вы хотите сохранить его как можно более универсальным, не привязываясь к конкретной реализации.

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