Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_OOP.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
302.59 Кб
Скачать

25. Наследование интерфейсов. Преимущества и недостатки. Объясните реализацию интерфейсов на примере интерфейса iAny:

Наследование интерфейса. Подкласс наследует типы атрибутов и сигнатуру операций (имя операции плюс формальные аргументы). Говорят, что подкласс поддерживает интерфейс суперкласса. Реализация унаследованных операций откладывается на более позднее время.

Реализация интерфейса:

type   // Определение интерфейса   IVehicle = Interface(IInterface)     function GetAge   : Integer;     function GetMiles : Integer;     property age   : Integer read GetAge;     property miles : Integer read GetMiles;   end;  // Выполнение этого интерфейса в классе car   // Обратите внимание, что TInterfaceObject определяет для нас   // QueryInterface, _AddRef, _Release функции   TCar = Class(TInterfacedObject, IVehicle)   private     fAge, fMiles : Integer;     fCarType : string;     function GetAge   : Integer;     function GetMiles : Integer;   public     property age     : Integer read GetAge;     property miles   : Integer read GetMiles;     property carType : string  read fCarType;

published     constructor Create(age, miles : Integer; carType : string);   end;

implementation

constructor TCar.Create(age, miles: Integer; carType: string); begin   fAge     := age;   fMiles   := miles;   fCarType := carType; end;

Преимущества и недостатки:

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

  • Интерфейсы более гибки по сравнению с базовыми классами из-за возможности определения одной реализации, способной реализовать несколько интерфейсов.

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

  • Интерфейсы полезны в случаях, когда невозможно использовать наследование класса. Например, структуры не способны наследовать у классов, но способны реализовать интерфейсы.

26 Сравнение абстрактных классов и интерейсов:

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

  2. Производный класс, реализующий интерфейс должен обеспечить реализацию всех операций интерфейса.

  3. Производный класс, реализующий абстрактный класс не обязан реализовывать все абстрактные методы.

27 Принцип подстановки Барбары Лисков. «Правильное» построение иерархий классов:

  • Пусть q(x) является свойством, верным относительно объектов x некоторого типа T. Тогда q(y) также должно быть верным для объектов y типа S, где S является подтипом типа T.

  • Функции, которые используют ссылки на базовые классы, должны иметь возможность использовать объекты производных классов, не зная об этом.

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

Есть много типов наследования. Два из них, это так-называемые "ограничивающее наследование" и "расширяющее наследование". Ограничивающее наследование определяет всё, что есть "вверху". Далее оно начинает ограничивать или скрывать элементы по мере того, как вы продвигаетесь "вниз" по экземпляру (например, квадрат - это прямоугольник, ограниченный одной измеряемой стороной). Расширяющее наследование - понятие противоположное ограничивающему наследованию. Здесь изначально верхние классы имеют только самые общие элементы, а более частные добавляются в процессе продвижения к экземпляру. Вообще, в ActionScript, классы получают всё больше и больше элементов по мере того, как становятся подклассами. Таким образом, они дополняются, то есть детализируют свои сверхклассы

Расширяющее наследование является самым приемлемым, т.к. самый ссыльный контракт должен быть на уровне главного класса и ослабляется на уровне дочерних.

  • Наследование интерфейса.

  • Наследование реализации.

    • Наследование посредством расширения.

    • Наследование посредством ограничения.

    • «Удобное» наследование.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]