Полиморфизм и расширяемость Java классов

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

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

Transport s1 = new Bus();

clip_image001

Transport s2 = new Tram();

Рис. 4.2. Пример реализации полиморфизма

Базовый класс Transport предоставляет общий интерфейс для своих подклассов. Порожденные классы Bus и Tram перекрывают эти определения для обеспечения уникального поведения.

/* пример # 5 : полиморфизм: Transport.java: Bus.java: Tram.java:

RepairingCenter.java: Runner.java*/

package chapt04;

import java.util.Random;

class Transport {

public void repair() {/* пустая реализация */

}

}

class Bus extends Transport {

public void repair() {

System.out.println("отремонтирован АВТОБУС");

}

}

class Tram extends Transport {

public void repair() {

System.out.println("отремонтирован ТРАМВАЙ");

}

}

class RepairingFactory {//шаблон Factory

public Transport getClassFromFactory(int numMode) {

switch (new Random().nextInt(numMode)) {

case 0:

return new Bus();

case 1:

return new Tram();

default:

throw new IllegalArgumentException();

// assert false;

// return null;

/*

* if((int)(Math.random() * numMode)==0) return new Bus(); else

* return new Tram(); как альтернативный и не очень удачный

* вариант. Почему?

*/

}

}

}

public class Runner {

public static void main(String[] args) {

RepairingFactory rc = new RepairingFactory();

Transport[] box = new Transport[15];

for (int i = 0; i < box.length; i++)

/* заполнение массива единицами проверямого транспорта */

box[i] = rc.getClassFromFactory(2);// 2 вида транспорта

for (Transport s : box)

s.repair();// вызов полиморфного метода

}

}

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

Класс RepairingFactory содержит метод getClassFromFactory(int numMode), который возвращает ссылку на случайно выбранный объект подкласса класса Transport каждый раз, когда он вызывается. Приведение к базовому типу производится оператором return, который возвращает ссылку на Bus или Tram. Метод main() содержит массив из ссылок Transport, заполненный с помощью вызова getClassFromFactory(). На этом этапе известно, что имеется некоторое множество ссылок на объекты базового типа и ничего больше (не больше, чем знает компилятор). Kогда происходит перемещение по этому массиву, метод repair() вызывается для каждого случайным образом выбранного объекта.

Если понадобится в дальнейшем добавить в систему, например, класс TrolleyBus, то это потребует только переопределения метода repair() и добавления одной строки в код метода getClassFromFactory(), что делает систему легко расширяемой.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

1 комментарий »

 
  • Вадим says:

    Спасибо. доступно и очень понятно. мне нравятся ваши посты. не хватает только оглавления или даже лучше сказать порядка подачи материала. выбираю любую статью – читаю – нравится. но хотелось бы чтоб с первого и вперед)
    так или иначе – спасибо. читаю ваши посты в метро! очень доступный язык и примеры.

 

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100