Лабораторная работа 1 2 лабораторная работа 2 31 лабораторная работа 3 44 лабораторная работа 4 74
Скачать 1.76 Mb.
|
5.12 Создание многоуровневой иерархииДо этого момента мы использовали простые иерархии классов, которые состоят только из суперкласса и подкласса. Однако можно строить иерархии, которые содержат столько уровней наследования, сколько вам нравится. Как уже говорилось, вполне приемлемо использовать подкласс в качестве суперкласса другого класса. Например, при наличии трех классов с именами А, B и C, класс С может быть подклассом B, который, в свою очередь, является подклассом А. В этом случае каждый подкласс наследует все черты всех своих суперклассов. В данном случае C наследует все аспекты B и A. Чтобы продемонстрировать пользу многоуровневой иерархии, рассмотрим следующую программу: // Расширить BoxWeight для включения стоимости отгрузки. // Начать с класса Box. class Box { private double width; private double height; private double depth; // создать клон объекта Box(Box ob) { // передать объект конструктору width = ob.width; height = ob.height; depth = ob.depth; } // конструктор, использующий все размеры Box(double w, double h, double d) { width = w; height = h; depth = d; } // конструктор, не использующий размеров Box() { width = -1; // использовать -1 для указания height = -1; // неинициализированного depth = -1; // блока } // конструктор для создания куба Box(double len) { width = height = depth = len; } // вычислить и возвратить объем double volume() { return width * height * depth; } } // Добавить вес. class BoxWeight extends Box { double weight; // вес блока // создать клон объекта BoxWeight(BoxWeight ob) { // передать объект конструктору super(ob); weight = ob.weight; } // конструктор, использующий все специфицированные параметры BoxWeight(double w, double h, double d, double m) { super(w, h, d); // вызвать конструктор суперкласса weight = m; } // конструктор по умолчанию BoxWeight () { super(); weight = -1; } // конструктор для создания куба BoxWeight(double len, double m) { super (len) ; weight = m; } } // Добавить стоимость отгрузки class Shipment extends BoxWeight { double cost; // построить клон объекта Shipment(Shipment ob) { // передать объект конструктору super(ob); cost = ob.cost; } // конструктор для всех специфицированных параметров Shipment(double w, double h, double d, double m, double c) { super(w, h, d, m); // вызвать конструктор суперкласса cost = c; } // умалчиваемый конструктор Shipment() { super(); cost = -1; } // конструктор для создания куба Shipment(double len, double m, double c) { super(len, m); cost = c; } } class DemoShipment { public static void main(String args[]) { Shipment shipmentl = new Shipment(10, 20, 15, 10, 3.41); Shipment shipment2 = new Shipment( 2, 3, 4, 0.76, 1.28); double vol; vol = shipmentl.volume(); System.out.println("Объем shipmentl равен " + vol); System.out.println("Вес shipmentl равен " + shipmentl.weight); System.out.println("Стоимость отгрузки: $" + shipmentl.cost); System.out.println(); vol = shipment2.volume (); System.out.println("Объем shipment2 равен " + vol); System.out.println("Вес shipment2 равен " + shipment2.weight); System.out.println("Стоимость отгрузки: $" + shipment2.cost); } } Здесь подкласс Boxweight используется как суперкласс для создания подкласса с именем Shipment. Shipment наследует все черты BoxWeight и Box и добавляет поле с именем cost (стоимость), которое содержит стоимость отгрузки такого пакета. Вывод этой программы: Объем shipmentl равен 3000.0 Вес shipmentl равен 10.0 Стоимость отгрузки: $3.41 Объем shipment2 равен 24.0 Вес shipment2 равен 0.76 Стоимость отгрузки: $1.28 Из-за наследования shipment может использовать предварительно определенные классы Box и BoxWeight, добавляя только дополнительную информацию, которая требуется для своего собственного специфического применения. Одно из преимуществ наследования – возможность повторного использования кода. Этот пример иллюстрирует другой важный аспект: super() всегда обращается к конструктору в самом близком суперклассе, super() в Shipment вызывает конструктор класса BoxWeight. super() в BoxWeight вызывает конструктор класса Bох. В иерархии классов, если конструктор суперкласса требует наличие параметров, то все подклассы должны передать эти параметры «вверх по линии». И это не зависит от того, нуждается ли подкласс в своих собственных параметрах. Замечание. В предыдущей программе полная иерархия классов, включающая Box, BoxWeight и Shipment, показана вся в одном файле. Это только для вашего удобства. В Java все три класса были бы помещены в свои собственные файлы и откомпилированы отдельно. При создании иерархий классов использование отдельных файлов на самом деле – норма, а не исключение. |