Когда и зачем использовать абстрактные классы / методы?

У меня есть несколько основных вопросов об абстрактных классах / методах. Я знаю, что основное использование абстрактных классов - это создание шаблонов для будущих классов. Но есть ли еще их использование? Когда вы предпочитаете их интерфейсам, а когда нет? Также, когда абстрактные методы полезны?

5 ответов

Решение

Я знаю, что основное использование абстрактных классов - это создание шаблонов для будущих классов. Но есть ли еще их использование?

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

Вы не можете предоставить реализацию для интерфейса.

Когда вы предпочитаете их интерфейсам, а когда нет?

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

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

Также, когда абстрактные методы полезны?

Абстрактные методы полезны так же, как полезно определение методов в интерфейсе. Для разработчика класса Abstract это способ сказать "любой мой ребенок ДОЛЖЕН реализовать этот метод".

Прочитайте следующую статью http://mycodelines.wordpress.com/2009/09/01/in-which-scenario-we-use-abstract-classes-and-interfaces/

Абстрактные классы

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

Например, снова возьмите пример класса транспортного средства выше. Если мы хотим, чтобы все классы, производные от Vehicle, реализовали метод Drive() фиксированным способом, тогда как другие методы могут быть переопределены дочерними классами. В таком сценарии мы реализуем класс Vehicle как абстрактный класс с реализацией Drive, а другие методы / свойства оставляем абстрактными, чтобы они могли быть переопределены дочерними классами.

-> Цель абстрактного класса - предоставить общее определение базового класса, которое могут совместно использовать несколько производных классов.

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

Используйте абстрактный класс

При создании библиотеки классов, которая будет широко распространяться или использоваться повторно - особенно для клиентов, используйте абстрактный класс вместо интерфейса; потому что это упрощает управление версиями. Это практика, используемая командой Microsoft, которая разработала библиотеку базовых классов. ( COM был разработан на основе интерфейсов.) Используйте абстрактный класс для определения общего базового класса для семейства типов. Используйте абстрактный класс для обеспечения поведения по умолчанию. Подкласс только базовый класс в иерархии, к которой класс логически принадлежит.

На очень высоком уровне:

Любая абстракция сводится к разделению интересов. "Клиентский" код абстракции не заботится о том, как выполняется контракт, представленный абстракцией. Вам, как правило, все равно, если в строковом классе используется реализация внутреннего хранилища с нулевым символом в конце или с отслеживанием длины буфера, например. Инкапсуляция скрывает детали, но делает классы / методы / и т. Д. абстрактный, вы разрешаете изменение реализации или добавление новых реализаций, не затрагивая клиентский код.

Абстрактные классы / методы обычно используются, когда класс предоставляет некоторые высокоуровневые функциональные возможности, но оставляет некоторые детали для реализации производными классами. Создание абстрактного класса / метода гарантирует, что он не может быть использован сам по себе, но должен быть специализированным для определения деталей, которые были исключены из реализации высокого уровня. Это чаще всего используется с шаблоном метода шаблона:

http://en.wikipedia.org/wiki/Template_method_pattern

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

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

Если вы ищете хорошие "Программная инженерия" и "Проектная документация", то я советую вам посмотреть:

https://prof.hti.bfh.ch/index.php?id=3494&L=2

О введении абстрактных классов:

https://prof.hti.bfh.ch/fileadmin/home/due1/uml_dp/script/udp-advancedclassmodeling-200910.pdf

Другие вопросы по тегам