Точное использование класса Abstract - PullRequest
18 голосов
/ 27 октября 2008

Что такое точное использование класса Abstract? Разве нельзя делать то же самое в обычном классе, поскольку это абстрактный класс?

Ответы [ 4 ]

24 голосов
/ 27 октября 2008

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

  • Интерфейс: только контракт, без реализации, без реализации
  • Абстрактный класс: контракт, некоторая реализация, нет реализации
  • Класс: контракт, реализация, реализация
19 голосов
/ 27 октября 2008

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

5 голосов
/ 27 октября 2008

Обычные классы требуют, чтобы вы предоставили реализации для всех методов.
Интерфейсы требуют, чтобы вы не предоставили какие-либо реализации для всех методов.

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

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

1 голос
/ 27 октября 2008

В отличие от обычных классов, abstract классы могут содержать abstract методы. Они действуют так же, как члены интерфейса.

Между тем, они могут делать практически все, что могут делать обычные классы: они могут реализовывать методы, содержать поля и вложенные типы, наследовать от другого класса и т. Д.

...