Вот статья MSDN в абстрактных классах, но я действительно не понимаю...
Когда я должен действительно использовать абстрактные классы? В чем преимущества использования абстрактных классов?
Вот статья MSDN в абстрактных классах, но я действительно не понимаю...
Когда я должен действительно использовать абстрактные классы? В чем преимущества использования абстрактных классов?
Абстрактные классы полезны, когда вам нужен класс с целью наследования и полиморфизма, но нет смысла создавать экземпляр самого класса, только его подклассы. Они обычно используются, когда вы хотите определить шаблон для группы подклассов с общим кодом реализации, но вы также хотите гарантировать, что объекты суперкласса не могут быть созданы.
Например, скажем, вам нужно создать объекты Dog, Cat, Hamster и Fish. Они обладают сходными свойствами, такими как цвет, размер и количество ног, а также поведение, поэтому вы создаете суперкласс. Однако, какой цвет является животным? Сколько ног имеет объект Animal? В этом случае нет смысла создавать экземпляр объекта типа Animal, а скорее только его подклассы.
Абстрактные классы также имеют дополнительное преимущество в полиморфизме, что позволяет использовать (абстрактный) тип суперкласса в качестве аргумента метода или типа возврата. Если, например, у вас был класс PetOwner с методом train(), вы можете определить его как взятие объекта типа Animal, например. train (Animal a) в отличие от создания метода для каждого подтипа Animal.
Вы используете их для классов, которые никогда не будут созданы (так эффективно не существует), но вы хотите наследовать их по причинам полиморфизма.
Используя абстрактные классы, мы можем сделать класс более общим.
Например: если класс A является абстрактным классом, и существуют классы класса B, класс C и класс D, расширяющие абстрактный класс A, тогда эти подклассы наследуют метод, который уже объявлен в абстрактном классе A, тем самым делая метод более общий.
Используйте абстрактные классы, когда вы определяете поведение для класса в вашей иерархической иерархии, которое никогда не будет использоваться для непосредственного создания объекта.
Итак, подумайте о себе как о Боге на мгновение. Ваши классы CBabyBoy и CBanyGirl не будут абстрактными - так как это сплошные объекты, которые создаются. С другой стороны, ваши классы CPerson и CAnimal должны быть абстрактными - они полезны с точки зрения иерархии типов, но вы никогда не будете запускать CAnimal dingbat = new Animal();
Ричард представил пример, что класс abstact имеет преимущества перед не-абстрактными классами.
Я хотел бы добавить таблицу фактов для выбора между абстрактным классом и интерфейсом. Изображение можно найти здесь.
В принципе, вы должны использовать абстрактный класс, когда у какого-либо объекта в вашей иерархии логически будет метод (ы), который он не знает, как реализовать, но это делают потомки. На самом деле есть миллиарды примеров "реальной жизни" по всей сети).