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

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

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

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

введите описание изображения здесь

Ответ 6

В принципе, вы должны использовать абстрактный класс, когда у какого-либо объекта в вашей иерархии логически будет метод (ы), который он не знает, как реализовать, но это делают потомки. На самом деле есть миллиарды примеров "реальной жизни" по всей сети).