
- •1.Объектно-ориентированные методы. Дайте определение объектно-ориентированного программирования, объектно-ориентированного проектирования и объектно-ориентированного анализа.
- •2. Сфера применения, преимущества и недостатки объектных методов.
- •3. Эволюция объектно-ориентированных языков программирования.
- •4. Эволюция методов объектно-ориентированного проектирования.
- •5. Объект как фундаментальное понятие объектно-ориентированных методов. Дайте определение состояния, поведения и уникальной идентичности объектов.
- •6. Уникальная идентичность объектов. Идентичность объектов Вселенной. Идентичность объектов в объектно-ориентированных моделях. Примеры.
- •7. Понятие класса в объектно-ориентированных методах. Дайте определение поведения и структуры класса. Понятие контракта и реализации класса. Обозначение класса в uml. Примеры.
- •17. Понятие полиморфизма. Классификация типов полиморфизма по Вегнеру.
- •25. Наследование интерфейсов. Преимущества и недостатки. Объясните реализацию интерфейсов на примере интерфейса iAny:
- •26 Сравнение абстрактных классов и интерейсов:
- •27 Принцип подстановки Барбары Лисков. «Правильное» построение иерархий классов:
- •28 Сравнение иерархий агрегации (is part of) и наследования (is kind of):
- •29 Делегирование методов (функциональный подход) и паттерн проектирования «Шаблонный метод»:
- •Применимость
- •30 Принцип инверсии управления в проектировании классов (IoC – Inversion of Control):
- •Управление доступом к членам класса. Члены-данные и члены-функции класса. Доступ к элементам класса. Синтаксис. Пример.
- •Специальные члены-функции класса. Синтаксис. Пример.
- •37. Конструктор класса. Виды конструкторов. Синтаксис. Пример.
- •38. Деструктор класса. Правила написания деструктора. Синтаксис. Пример.
- •39. Друзья класса. Дружественные функции и классы. Правила относительно друзей. Пример.
- •40. Оператор присваивания. Назначение. Синтаксис. Пример.
- •43. Статические (static) члены класса. Назначение. Синтаксис. Пример.
- •Проектирование классов с методами без побочных эффектов.
- •Проектирование по контракту: пред и постусловия, инвариант класса.
- •Понятие метаклассов.Поддержка метаклассов в различных языках программирования.
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 Сравнение абстрактных классов и интерейсов:
Абстрактный класс может обеспечить частичную реализацию некоторых операций, в то время как чистый интерфейс откладывает определение всех операций.
Производный класс, реализующий интерфейс должен обеспечить реализацию всех операций интерфейса.
Производный класс, реализующий абстрактный класс не обязан реализовывать все абстрактные методы.
27 Принцип подстановки Барбары Лисков. «Правильное» построение иерархий классов:
Пусть q(x) является свойством, верным относительно объектов x некоторого типа T. Тогда q(y) также должно быть верным для объектов y типа S, где S является подтипом типа T.
Функции, которые используют ссылки на базовые классы, должны иметь возможность использовать объекты производных классов, не зная об этом.
Большое значение имеет правильное построение иерархии классов. Одна из известных проблем больших систем, построенных по ООП-технологии — так называемая проблема хрупкости базового класса. Она состоит в том, что на поздних этапах разработки, когда иерархия классов построена и на её основе разработано большое количество кода, оказывается трудно или даже невозможно внести какие-либо изменения в код базовых классов иерархии (от которых порождены все или многие работающие в системе классы). Даже если вносимые изменения не затронут интерфейс базового класса, изменение его поведения может непредсказуемым образом отразиться на классах-потомках. В случае крупной системы разработчик базового класса не просто не в состоянии предугадать последствия изменений, он даже не знает о том, как именно базовый класс используется и от каких особенностей его поведения зависит корректность работы классов-потомков.
Есть много типов наследования. Два из них, это так-называемые "ограничивающее наследование" и "расширяющее наследование". Ограничивающее наследование определяет всё, что есть "вверху". Далее оно начинает ограничивать или скрывать элементы по мере того, как вы продвигаетесь "вниз" по экземпляру (например, квадрат - это прямоугольник, ограниченный одной измеряемой стороной). Расширяющее наследование - понятие противоположное ограничивающему наследованию. Здесь изначально верхние классы имеют только самые общие элементы, а более частные добавляются в процессе продвижения к экземпляру. Вообще, в ActionScript, классы получают всё больше и больше элементов по мере того, как становятся подклассами. Таким образом, они дополняются, то есть детализируют свои сверхклассы
Расширяющее наследование является самым приемлемым, т.к. самый ссыльный контракт должен быть на уровне главного класса и ослабляется на уровне дочерних.
Наследование интерфейса.
Наследование реализации.
Наследование посредством расширения.
Наследование посредством ограничения.
«Удобное» наследование.