Полимофизм и расширяемость
В следующем примере приведение к базовому типу происходит в выражении:
Stone s1 = new White();
Stone s2 = new Black();
Базовый класс Stone предоставляет общий интерфейс для всех наследников. Порожденные классы перекрывают эти определения для обеспечения уникального поведения.
// пример # 7 : полиморфизм : StoneRandom.java
class Stone {
public void add() {/*пустая реализация*/}
}
class White extends Stone {
public void add() {
System.out.println("добавлен белый камень");
}
}
class Black extends Stone {
public void add() {
System.out.println("добавлен черный камень ");
}
}
public class StoneRandom {
public static Stone randStone() {
//if((int)(Math.random() * 2)==0) return new Black();
//else return new White();//как альтернативный вариант
switch((int)(Math.random() * 2)){
case 0: return new Black();
case 1: return new White();
default: return null;
}
}
public static void main(String[] args) {
Stone[] s = new Stone[10];
for(int i = 0; i < s.length; i++)
/* заполнение массива камнями */
s[i] = randStone();
for(int i = 0; i < s.length; i++)
s[i].add();// вызов полиморфного метода
}
}
}
Главный класс StoneRandom содержит static метод randStone(), который возвращает ссылку на случайно выбранный объект подкласса класса Stone каждый раз, когда он вызывается. Приведение к базовому типу производится оператором return, который возвращает ссылку на Black или White. Метод main() содержит массив из ссылок Stone, заполненный вызовами randStone(). На этом этапе известно, что имеется некоторое множество ссылок на объекты базового типа и ничего больше (не больше, чем знает компилятор). Kогда происходит перемещение по этому массиву, метод add() вызывается для каждого случайным образом выбранного объекта.
Если понадобится в дальнейшем добавить систему, например класс Green, то это потребует только переопределения соответствующих методов и добавления одной строки в код метода randStone(), что делает систему легко расширяемой.
Дата добавления: 2015-04-05; просмотров: 905;