Правильно ли используются принципы ООП

Рейтинг: 3Ответов: 2Опубликовано: 04.04.2015

Имеется абстрактный класс Фигура c абстрактными методами. Его наследует абстрактный класс Фигура2D, которая определяет методы родителя. К классу Фигура2D добавлены также виртуальные методы.

Вопросы:
1) Нормально ли, что в абстрактном классе Фигура2D имеются методы с телом (методы родителя, которые нужно реализовать)
2) Нормально ли, что абстрактный класс имеет виртуальные методы (то есть класс является одновременно полиморфным и абстрактным)

p.s.: Реализуется в c#

Ответы

▲ 10Принят
  1. Да. Хотя лично я не припомню, чтобы видел иерархию наследования с двумя абстрактными классами. Вообще, чем дальше практикуешь ООП, тем больше предпочитаешь простые иерархии и композицию.
  2. Да. Абстрактный класс тем и отличается от интерфейса, что может содержать некоторое поведение по умолчанию, которое как раз и может содержаться в виртуальных методах.
▲ 4

1) Нормально ли, что в абстрактном классе Фигура2D имеются методы с телом (методы родителя, которые нужно реализовать)

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

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

За этим замысловатым описанием скрывается один из самых распространенных паттернов проектирования, под названием Шаблонный метод, который является фундаментальным для создания удобных в использовании иерархий типов.

Выглядит он может так:

abstract class Shape {}

abstract class Shape2D : Shape
{
  public void Draw()
  {
     DrawFirstPart();
     DrawSecondPart();
     FillShape();
  }

  protected abstract DrawFirstPart();
  protected abstract DrawSecondPart();
  protected abstract FillShap();
}

2) Нормально ли, что абстрактный класс имеет виртуальные методы (то есть класс является одновременно полиморфным и абстрактным).

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