2010-07-27 3 views
33

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

+0

возможно дубликат [Interface против базового класса] (http://stackoverflow.com/questions/56867/interface-vs-base-class) - и есть ** много ** больше с очень качественными ответами: просто выполните поиск по «абстрактному классу интерфейса». –

ответ

46

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

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

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

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

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

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

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

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

+1

«Вы не можете обеспечить реализацию для интерфейса». В Java 8 можно использовать метод по умолчанию. –

2

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

Абстракции любого рода сводится к тому, отделяющих проблемы. Код «Клиент» абстракции не волнует, как выполняется контракт, открытый абстракцией. Обычно вам неважно, использует ли класс строк для реализации внутреннего хранилища с нулевым завершением или с буфером длины. Инкапсуляция скрывает детали, но путем создания классов/методов/и т. Д. abstract, вы разрешаете реализацию изменять или добавлять новые реализации, не затрагивая клиентский код.

4

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

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

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

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

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

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

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

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

1

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

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

1

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

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

0

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

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

веселит

Daniel

Смежные вопросы