Пример программы с иерархией классов

До сих пор мы использовали простые иерархии классов, которые состояли только из суперкласса и подкласса. Однако можно строить иерархии, которые содержат любое количество уровней наследования. Как уже отмечалось, вполне допустимо использовать подкласс в качестве суперкласса другого подкласса.

Например, класс С может быть подклассом класса В, который, в свою очередь, является подклассом класса А. В подобных ситуациях каждый подкласс наследует все характеристики всех его суперклассов. В приведенном примере класс с наследует все характеристики классов в и А. В качестве примера многоуровневой иерархии рассмотрим следующую программу. В ней подкласс BoxWeight использован в качестве суперкласса для создания подкласса Shipment. Shipment наследует все характеристики классов BoxWeight и Box и добавляет поле cost, которое содержит стоимость поставки такого пакета.

// Расширение класса BoxWeight за счет включения в него стоимости доставки.
// Начнем с создания класса Box.

28 Пример с клоунами. Иерархия классов/Интерфейсы/as/base


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++ #98


// конструктор, используемый по умолчанию
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(«Bee shipmentl равен » + shipmentl.weight) ,
System.out.println(«Стоимость доставки: $» + shipmentl.cost) System.out.println ();
vol = shipment2.volume();
System.out.println(«Объем shipment2 равен » + vol);
System.out.println («Bee shipment2 равен » + shipment2.weight);
System.out.println(«Стоимость доставки: $» + shipment2.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 вызывает конструктор класса Box. Если в иерархии классов конструктор суперкласса требует передачи ему параметров, все подклассы должны передавать эти параметры «по эстафете». Данное утверждение справедливо независимо от того, нуждается ли подкласс в собственных параметрах.

На заметку! В приведенном примере программы вся иерархия классов, включая Box, BoxWeight и Shipment, находится в одном файле. Это сделано только ради удобства. В Java все три класса могли бы быть помещены в отдельные файлы и компилироваться независимо друг от друга. Фактически, использование отдельных файлов — норма, а не исключение при создании иерархий классов.

Источник: www.linkex.ru

Пример реализации иерархии классов с использованием наследования

Рассмотрим в качестве примера наследование для классов описанной ранее иерархии фигур. Для простоты выберем вариант, в котором Figure — это класс-прародитель иерархии, Dot и ScalableFigure его потомки, а Circle — потомок ScalableFigure (то есть является «маштабируемой фигурой»). Напомним, что имена классов принято начинать с заглавной буквы.

inheritance

Класс Figure опишем как абстрактный – объектов такого типа создавать не предполагается, так как фигура без указания конкретного вида – это, действительно, чистая абстракция. По той же причине методы show («показать») и hide («скрыть») объявлены как абстрактные. Напомним также, что если в классе хоть один метод является абстрактным, это класс обязан быть объявлен как абстрактный.
public abstract class Figure //это абстрактный класс

Читайте также:
Характеристика основных целевых программ

int x=0;
int y=0;
java.awt.Color color;
java.awt.Graphics graphics;
java.awt.Color bgColor;

Поля x и y задают координаты фигуры, а color – ее цвет. Соответствующий тип задан в пакете java.awt. Поле graphics задает ссылку на графическую поверхность, по которой будет идти отрисовка фигуры. Соответствующий тип также задан в пакете java.awt. В отличии от полей x, y и color для этого поля при написании класса невозможно задать начальное значение, и оно будет присвоено при создании объекта.

То же относится к полю bgColor (от «background color») – в нем мы будем хранить ссылку на цвет фона графической поверхности. Цветом фона мы будем выводить фигуру в методе hide для того, чтобы она перестала показываться на экране. Это не самый лучший, но зато самый простой способ скрыть фигуру. В дальнейшем при желании реализацию метода можно изменить – это никак не коснется остальных частей программы.

Метод moveTo имеет реализацию несмотря на то, что класс абстрактный, и в этой реализации используются имена абстрактных методов show и hide. Этот вопрос будет подробно обсуждаться в заметке, посвященном полиморфизму.

Рассмотрим теперь, как задается потомок класса Figure – класс Dot («Точка»). Для Dot классы Object и Figure будут являться прародителями (суперклассами), причем Figure будет непосредственным прародителем. Соответственно, для них класс Dot будет являться потомком (подклассом), причем для класса Figure – непосредственным потомком.

Класс Dot расширяет (extends) функциональность класса Figure: хотя в нем и не появляется новых полей, зато пишется реализация для методов show и hide, которые в прародительском классе были абстрактными. В классе Figure мы использовали классы пакета java.awt без импорта этого пакета. В классе Dot используется импорт (import) – обычно это удобнее, так как не надо много раз писать длинные имена.

Отметим, что в классе Dot не задаются поля x, y, graphics и метод moveTo – они наследуются из класса Figure. А абстрактные методы show и hide переопределяются (override) – для них пишется реализация, соответствующая тому, каким именно образом точка появляется и скрывается на экране.

Конструктор Dot(Graphics graphics, Color bgColor) занимается созданием объекта типа Dot и инициализацией его полей. В методах show и hide используются методы объекта graphics. В методе show сначала во временной переменной oldC сохраняется информация о текущем цвете рисования. Затем в качестве текущего цвета устанавливается черный цвет (константа java.awt.

Читайте также:
Код активации к программе movavi

Color.BLACK ). Затем вызывается метод, рисующий точку, в качестве него используется рисование линии с совпадающими началом и концом. После чего восстанавливается первоначальный цвет рисования. Это необходимо для того, чтобы не повлиять на поведение других объектов, пользующихся для каких-либо целей текущим цветом.

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

Статья написана на базе книги В. Монахов. Язык программирования Java и среда NetBeans.

Источник: asidun.wordpress.com

Как работать с иерархической структурой классов

Задача классификации — одна из самых известных в машинном обучении. Очень многие проблемы, решаемые с помощью ML, так или иначе сводятся к классификации — распознавание изображений, например. И все выглядит просто и понятно, когда нам нужно определить объект в один из нескольких классов.

А что если у нас не плоская структура из нескольких классов, а сложная разветвленная иерархия на 683 категории? Именно о таком случае мы сегодня и поговорим. Под катом — рассказ о том, зачем в задачах классификации нужны сложные иерархии и как с ними жить.

В любой задаче классификации есть набор классов и есть модель, которая умеет предсказывать класс для новых данных. Допустим, модель бинарной классификации Спам/не спам, модель классификации настроения текста Хорошо/нейтрально/плохо. Классы обычно являются абстракцией реальности, а абстракция — это всегда упрощение.

Однако реальность может быть гораздо сложнее, ведь имеется некоторая структура, взаимосвязи между классами. Одна из часто встречаемых в жизни структур это дерево иерархии. Существует множество вещей, которые можно классифицировать по одному принципу, но на разных уровнях абстракции или обобщения. Например, известная со школы классификация животных.

На первом уровне это могут быть Млекопитающие и Рептилии, на втором — Дельфины и Ящерицы. Определенный объект можно отнести к одному из классов на каждом уровне, причем все объекты, относящиеся к некоторому классу, также относятся и к родителю этого класса.

Это звучит понятно в школьном учебнике, но в контексте машинного обучения возникает множество вопросов:

  • Как с этим всем обращаться?
  • Какие классы предсказывать?
  • Сколько моделей тренировать для решения задачи?
  • Как работать с данными?
  • Как вносить изменения в иерархию классов и как реагировать на эти изменения с точки зрения модели?

Все эти проблемы мы разберем на примере задачи классификации, которую мы решаем в Контуре.

Постановка задачи

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru