Главная страница

Лабораторная работа 1 2 лабораторная работа 2 31 лабораторная работа 3 44 лабораторная работа 4 74


Скачать 1.76 Mb.
НазваниеЛабораторная работа 1 2 лабораторная работа 2 31 лабораторная работа 3 44 лабораторная работа 4 74
Дата12.03.2021
Размер1.76 Mb.
Формат файлаdoc
Имя файлаOOP_Lab_Rus.doc
ТипЛабораторная работа
#184105
страница21 из 31
1   ...   17   18   19   20   21   22   23   24   ...   31

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 все три класса были бы помещены в свои собственные файлы и откомпилированы отдельно. При создании иерархий классов использование отдельных файлов на самом деле – норма, а не исключение.
1   ...   17   18   19   20   21   22   23   24   ...   31


написать администратору сайта