Вот статья MSDN об абстрактных классах, но я действительно не получаю ее...
Когда я должен действительно использовать абстрактные классы? Каковы преимущества использования абстрактных классов?
Абстрактные классы полезны, когда вам нужен класс для целей наследования и полиморфизма, но нет смысла создавать экземпляр самого класса, только его подклассы. Они обычно используются, когда вы хотите определить шаблон для группы подклассов, которые имеют общий код реализации, но вы также хотите гарантировать, что объекты суперкласса не могут быть созданы.
Например, предположим, что вам нужно создать объекты «Собака», «Кошка», «Хомяк» и «Рыба». Они обладают схожими свойствами, такими как цвет, размер и количество ног, а также поведение, поэтому вы создаете суперкласс Animal. Однако какого цвета животное? Сколько ног у объекта Animal? В этом случае нет особого смысла создавать экземпляр объекта типа Animal, а только его подклассы.
Абстрактные классы также имеют дополнительное преимущество в виде полиморфизма, позволяя вам использовать тип (абстрактного) суперкласса в качестве аргумента метода или типа возвращаемого значения. Если, например, у вас был класс PetOwner с методом train (), вы можете определить его как принимающий объект типа Animal, например. train (Animal a), а не создание метода для каждого подтипа Animal.
Используйте абстрактные классы, когда вы определяете поведение класса в своей иерархии классов, которое никогда не будет использоваться для создания экземпляра объекта напрямую.
Итак, подумайте о себе как о Боге на мгновение. Ваши классы CBabyBoy и CBanyGirl не будут абстрактными - это твердые объекты, которые создаются. С другой стороны, ваши классы CPerson и CAnimal БУДУТ абстрактными - они полезны с точки зрения иерархии типов, но вы никогда не будете запускать CAnimal dingbat = new Animal ();
Вы используете их для классов, которые никогда не будут созданы (то есть фактически не существуют), но вы хотите наследовать от них по причинам полиморфизма.
По сути, вы должны использовать абстрактный класс, когда у некоторого объекта в вашей иерархии логически будут методы, которые он не знает, как реализовать, но он потомки делают. На самом деле в Интернете есть миллиарды примеров из реальной жизни)