Изменить состояние объекта-части можно только в рамках самого контейнера, извне это сделать нельзя.
Пример
Сущности аналогичны базовым. Отличия в предметной области: осветительный прибор собирается на заводе изготовителе и представляет собой единое целое. Замена частей невозможна.
Отличия в программном коде заключаются в изменении конструктора класса Прибор. В этом конструкторе создаются объекты-части (лампочка и корпус изготавливаются на заводе на основе их технических характеристик, принятых в качестве параметров).
public Прибор(Корпус кор, Лампочка лам, string состояние)
{
this.кор = new Корпус();
this.кор.Тип = кор.Тип;
this.кор.Цена = кор.Цена;
this.лам = new Лампочка();
this.лам.Цена = лам.Цена;
this.лам.Мощность = лам.Мощность;
this.состояние = состояние;
}
Весь остальной код остается неизменным. В обоих случаях будут выведены одни те же характеристики прибора.
//смена эталонной лампочки
п = new Прибор(к, л, "Включено");
Если поле, определяющее лампочку в классе Прибор сделать открытым, лампочку можно будет заменить, не создавая нового прибора.
п.лам.Мощность = 200.0;
Но это противоречит описанию предметной области.
Композиция на основе структур
Структура – тип данных, который позволяет определять в рамках единого целого поля разных типов и методы их обработки. В этом смысле структура аналогична классу.
Отличия от класса (основные)
1. Структуры относятся к типам значения, т.е. при присваивании одной структуры другой происходит копирование не ссылки, а всех полей структуры.
Копирование выполняется поверхностное (с полей значения снимается копия значений, с полей ссылок снимается копия ссылки).
Таким образом, задача создания осветительного прибора, не допускающего замены корпуса и лампочки, может быть решена с помощью кода абсолютно идентичного коду базового примера путем замены классов Корпус, Лампочка, Прибор, путем замены классов на структуры.
class à struct
2. Для структур не поддерживается механизм наследования.
Прочие отличия
НАСЛЕДОВАНИЕ
Понятие наследования
С точки зрения моделирования предметной области наследование предназначено для описания некоторой сущности (потомка) путем указания отличий от другой сущности (предка).
В ООП наследование рассматривается как отношение между классами, при котором класс-потомок представляет собой разновидность класса-предка.
Отношение наследования раскрывает предметную область по типу «общее - специфическое». Представление предметной области в виде наследования представляет собой иерархию, на вершине которой находится класс-предок (базовый класс), а на нижних уровнях – классы-наследники (наследуемые классы).
Предок может иметь множество наследников. Наследник может иметь не более одного прямого предка. Другими словами, в С# явным образом не поддерживается множественное наследование. Потомок не может унаследовать поля и методы от нескольких прямых предков. Пример наследования приведен на Рис.1.
Специфические черты классу-потомку могут быть приданы двумя способами:
- Дополнение унаследованных от предка полей и методов новыми полями и методами. В результате потомок становится сложнее по структуре и поведению.
- Изменение унаследованных от предка полей и методов. В результате потомок не становится сложнее, меняется лишь способ реализации полей и методов, то есть имеет место отношение: то же самое, но сделано по-другому.
Механизм реализации:
- При определении класса-потомка указывается базовый класс: class ИмяКласса: ИмяБазовогоКласса;
- В классе определяются дополнительные поля и методы или переопределяются поля и методы базового класса.
С точки зрения технологии программирования наследование позволяет решить проблемы:
• Повторное использование кода (создание новых классов на основе существующих)
• Модификация существующего кода (изменение в базовом классе немедленно приводит к изменению в классах-потомках)
Дата: 2019-02-02, просмотров: 267.