#c_sharp #ооп
Имеется абстрактный класс Фигура c абстрактными методами. Его наследует абстрактный класс Фигура2D, которая определяет методы родителя. К классу Фигура2D добавлены также виртуальные методы. Вопросы: 1) Нормально ли, что в абстрактном классе Фигура2D имеются методы с телом (методы родителя, которые нужно реализовать) 2) Нормально ли, что абстрактный класс имеет виртуальные методы (то есть класс является одновременно полиморфным и абстрактным) p.s.: Реализуется в c#
Ответы
Ответ 1
Да. Хотя лично я не припомню, чтобы видел иерархию наследования с двумя абстрактными классами. Вообще, чем дальше практикуешь ООП, тем больше предпочитаешь простые иерархии и композицию. Да. Абстрактный класс тем и отличается от интерфейса, что может содержать некоторое поведение по умолчанию, которое как раз и может содержаться в виртуальных методах.Ответ 2
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) Нормально ли, что абстрактный класс имеет виртуальные методы (то есть класс является одновременно полиморфным и абстрактным). Наличие конкретных методов в абстракном классе не делает его "конкретным" или "полиморфным". Любой абстрактный класс будет содержать реализацию, в противном случае вы бы использовали интерфейс.
Комментариев нет:
Отправить комментарий