Какая здесь потребность в абстрактном классе? - PullRequest
2 голосов
/ 19 марта 2012

Один из вопросов интервью, которые мне задали совсем недавно.

Что такое абстрактный класс в C #?
Абстрактный класс - это класс, который не может быть создан и может включать в себя абстрактные методы или методы экземпляра, конструкторы и т. Д.

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

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

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

Нужна помощь в правильном понимании ....

Ответы [ 4 ]

5 голосов
/ 19 марта 2012

Абстрактный класс является базовым классом, но это базовый класс, который обычно имеет некоторые абстрактные члены. Это позволяет вам писать код в абстрактном классе, который вызывает этих абстрактных членов, но без какой-либо реализации ... затем он заставляет конкретные классы, производные от абстрактного класса, реализовать эти члены.

Преимущества наличия абстрактного класса, а не просто конкретного базового класса, в который некоторые члены выдают NotImplementException s:

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

Как пример, на днях я написал класс абстрактного класса, расширяющий JsonConverter в Json.NET. Цель состояла в том, чтобы он был базовым классом для любых преобразователей для структур в моем проекте - он обрабатывал бы все конвертируемые типы, допускающие значения NULL (и десериализовывал пустой JSON в нулевое значение), оставляя производные классы свободными до всего сосредоточиться на типовой части. Посмотрите на это (NodaConverterBase) и посмотрите, не прояснит ли это что-то.

1 голос
/ 19 марта 2012

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

0 голосов
/ 20 марта 2012

хитрая фраза

"partial implementation."

В дополнение к тому, что вы упомянули в своем посте, абстрактный класс не должен реализовывать все функции, и дети ДОЛЖНЫ реализовывать нереализованные функции или сами объявляться абстрактными.

0 голосов
/ 19 марта 2012

Посмотрите на это так, если бы вы писали приложение для отслеживания животных в зоопарке, у вас были бы классы для Обезьяны, Слона, Крокодила и т. Д. ... Все они животные, поэтому вы бы хотели, чтобы они унаследовали базовый класс. животных (потому что им всем нужны базовые функции, такие как еда, дыхание и т. д.). Но у вас никогда не было бы животного, которое было бы просто животным, поэтому вы бы сделали Животное абстрактным, потому что вам никогда не понадобился бы его экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...