Абстрактный класс может содержать и полностью определенные методы, в отличие от сходного с ним по предназначению специального вида класса, называемого интерфейсом. Интерфейсы рассматриваются в следующей главе.
Если в классе есть хотя бы один абстрактный метод, весь класс также должен быть описан как абстрактный, например:
class Monster: Spirit
{
//...
override public void Passport()
{
Console.WriteLine("Monster {0} \t health = {1} ammo = {2}".
name, health, ammo);
}
//...
}
class Daemon: Monster
{
//...
override public void Passport()
{
Console.WriteLine(
"Daemon {0} \t health = {1} ammo = {2} brain = {3}".
Name.Health, Ammo, brain);
}
// Полный текст этих классов приведен в главе 12
}
Абстрактные классы используются при работе со структурами данных, предназначенными для хранения объектов одной иерархии, и в качестве параметров методов. Если класс, производный от абстрактного, не переопределяет все абстрактные методы, он также должен описываться как абстрактный.
Можно создать метод, параметром которого является абстрактный класс. На место этого параметра при выполнении программы может передаваться объект любого производного класса. Это позволяет создавать полиморфные методы, работающие с объектом любого типа в пределах одной иерархии. Полиморфизм в различных формах является мощным и широко применяемым инструментом ООП.
ПРИМЕЧАНИЕ
Мы уже использовали полиморфизм в разделе «Оператор foreach» (см. с. 136) для того, чтобы метод PrintArray мог работать с массивом любого типа. Еще один пример применения абстрактных и виртуальных методов имеется в главе 10.