При разработке начинать нужно с композиции. Композиция позволяет динамически выбрать тип. Динамическое изменение поведения объекта с помощью композиции.
class Actor {
public void act () {}
}
class HappyActor extends Actor {
public void act () { System.out.printl (“HappyActor”);}
}
class SadActor {
public void act (){ System.out.println (“SadActor”);}
}
class Stage {
private Actor actor = new HappyActor ();
public void change () {actor = new SadActor ();}
public void performPlay () {actor.act ();}
}
public class Transformogrify {
public static void main (String [] args) {
Stage stage = new Stage ();
Stage.performPlay ();
Stage.change ();
Stage.performPlay ();
}
}
Напечатается: HappyActor
SadActor
Ссылка на Actor присоединяется к разным типам во время выполнения программы (динамически меняется поведение объекта).Это - паттерн «Состояние» (State).
Нисходящее преобразование типов
(downcasting)
Это преобразование от суперкласса к подклассу. Для восстановления типа после upcasting. Если нужно вызвать методы, которых нет в базовом классе.
class Useful {
public void f() {}
public void g() {}
}
class MoreUseful extends Useful {
public void f() {}
public void g() {}
public void u() {}
}
public class UsefulsTest {
public static void main (String [] args) {
Useful [] x = { new Useful (), new MoreUseful ()};
|
|
x[0].f(); x[1].g();
// x[1].u()-компилятор не допустит
((MoreUseful) x[1]).u();// OK, downcasting
((MoreUseful) x[0]).u();// исключение ClassCastException
}
1.downcasting должен делаться явно.
2. Объект должен быть того класса, к которому делается приведение. Иначе- исключение ClassCastException.
Обычно делают так
if (x[1] instanseof MoreUseful) ((MoreUseful) x[1]). u());
instanseof – оператор проверки типов. Проверяет, имеет ли его левый операнд тип правого операнда.(Или его суперклассов).
Проверка типов во время выполнения программы –это динамическое определение типов.(RTTI- run-time type identification).
Тема 9
Абстрактные классы и интерфейсы