Справочные переменные для типов поведения интерфейса в Java - PullRequest
0 голосов
/ 23 марта 2011

Я читаю Head First Design Patterns и немного разбираюсь в Java. Он начинается с инкапсуляции вещей, которые отличаются от вашего класса, и помещения их в отдельный интерфейс, в отличие от помещения этих функций в подкласс. В качестве примера они приводят абстрактный класс Duck, который может крякать или летать в зависимости от утки. У них есть интерфейс для Quack and Fly (интерфейсы QuackBehavior и FlyBehavior), а затем они реализуют эти интерфейсы в других классах.

В примере они имеют абстрактный класс утки следующим образом

public abstract class Duck {
   QuackBehavior quackBehavior;
   FlyBehavior flyBehavior;
.....
}

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

Ответы [ 3 ]

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

Это действительная и распространенная практика.

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

В противном случае, как бы вы могли вести себя по-разному?Теперь вы можете назначить LowFlyBehaviour и HighFlyBehaviour для поля, и, таким образом, разные экземпляры Duck могут иметь различное поведение при полете.Если бы поле относилось к одному из этих конкретных типов, это было бы невозможно.

0 голосов
/ 23 марта 2011

Да, это действительно. Применяются только те правила, которые применяются к любому другому типу; а именно, что вы можете назначить только то, что реализует заявленный интерфейс. Вы, вероятно, видели или даже использовали подобный синтаксис раньше, даже не осознавая этого, например:

List<String> list = new ArrayList<String>();
Serializable s = new Object();
0 голосов
/ 23 марта 2011

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

Это обычное поле.

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