Композиция на основе открытых объектов

И композиция и наследование – встраивание подобъекта внутрь нового класса.

Композиция использует функциональность, возможности существующего класса и не использует интерфейс. Т.е. клиент видит интерфейс нового класса и не видит встроенных объектов (используется реализация, а не интерфейс).

При наследовании виден интерфейс встроенного объекта. Иногда открывают доступ к интерфейсу и при композиции. Моделируем автомобиль (Car)

class Engine { public void start (){}…}

class Wheel { public void inflate (int psi){}…}

class Window { public void rollup (){}…}

class Door { public Window window = new Window ();

public void open {}…}

public class Car {

public Engine engine = new Engine ();

public Wheel[] wheel = new Wheel [4];

public Door left = new Door (),

right = new Door ();

public Car (){ for (int i=0; i<4; i++)

wheel [i] = new Wheel ();

}

public static void main (String[]args) {

Car car = new Car ();

car.left.window.rollup();

car.wheel [0].inflame (72);

}

}

Если строится иерархия Машина – Средство передвижения -нужно применять наследование..

System.out.println ()- пример композиции с статическим полем-открытым объектом out класса PrintStream

Восходящее преобразование типов (upcasting)

Наследник имеет тип базового класса. Любое сообщение, которое можно отправить базовому классу, можно отправить и производному (все не приватные методы базового доступны в производном).

class Instrument {

public void play ();

static void tune (Instrument i) {

i.play ();

}

}

public class Wind extends Instrument {

public static void main (String [] args) {

Wind flute = new Wind ();

Instrument.tune (flute);

}

}

flute тоже имеет метод play();

В методе tune код работает для Insrtument и любых объектов, производных от Insrtument.

Наследование, как правило, применяется, если нужен upcasting. Если нет -композиция.

Ключевое слово final

Может применяться для:

1) для примитивных типов – делает их const – ой.

static final – это константа, которая хранится в памяти в единственном экземпляре и не может быть изменена;

2) для ссылок – постоянной будет ссылка (не может указывать на другой объект). Объект может изменяться.

3) Могут быть неизменные аргументы метода.

int g(final int i){return i++;}-нельзя,это ошибка

4) final - метод (нельзя переопределить), final – класс (нельзя наследовать).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: