Когда использовать абстрактные классы? - PullRequest
77 голосов
/ 03 апреля 2010

Вот статья MSDN о абстрактных классах , но я действительно не понимаю ...

Когда мне действительно следует использовать абстрактные классы? Каковы преимущества использования абстрактных классов?

Ответы [ 6 ]

136 голосов
/ 03 апреля 2010

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

Например, допустим, вам нужно создать объекты Dog, Cat, Hamster и Fish. Они обладают схожими свойствами, такими как цвет, размер и количество ног, а также поведение, поэтому вы создаете суперкласс Animal. Однако какого цвета это животное? Сколько ног у животного? В этом случае не имеет особого смысла создавать экземпляр объекта типа Animal, а только его подклассы.

Абстрактные классы также имеют дополнительное преимущество в полиморфизме - позволяя вам использовать (абстрактный) тип суперкласса в качестве аргумента метода или возвращаемого типа. Например, если у вас был класс PetOwner с методом train (), вы можете определить его как получение объекта типа Animal, например train (Animal a), в отличие от создания метода для каждого подтипа Animal.

6 голосов
/ 27 июля 2012

Используя абстрактные классы, мы можем сделать класс более универсальным.

Например: если класс A является абстрактным классом и существуют классы B, класс C и класс D, расширяющие абстрактный класс A, тоэти подклассы будут наследовать метод, который уже объявлен в абстрактном классе A, тем самым делая метод более универсальным.

4 голосов
/ 03 апреля 2010

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

3 голосов
/ 24 февраля 2016

Ричард предоставил пример , в котором абстрактный класс имеет преимущества перед неабстрактными классами.

Я хотел бы добавить таблицу фактов для выбора между абстрактным классом и интерфейсом. Изображение можно найти здесь .

enter image description here

3 голосов
/ 03 апреля 2010

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

Итак, подумайте о себе как о Боге на мгновение. Ваши классы CBabyBoy и CBanyGirl не будут абстрактными - так как это твердые объекты, которые создаются. С другой стороны, ваши классы CPerson и CAnimal были бы абстрактными - они полезны с точки зрения иерархии типов, но вы никогда не будете запускать CAnimal dingbat = new Animal();

2 голосов
/ 03 апреля 2010

По сути, вы должны использовать абстрактный класс, когда у какой-либо сущности в вашей иерархии будут логические методы, которые он не знает, как реализовать, но это делают потомки. На самом деле в Интернете есть миллиарды примеров из «реальной жизни»

...