This article has been localized into Russian by the community.
Больше абстрактных классов
В предыдущей главе мы рассмотрели абстрактные классы. В этой главе мы немного расширим примеры и добавим некоторые абстрактные методы. Абстрактные методы допускаются только в абстрактных классах. Их определение будет выглядеть как обычный метод, но внутри них нет кода:
abstract class FourLeggedAnimal
{
public abstract string Describe();
}
Итак, почему вы хотите определить пустой метод, который ничего не делает? Потому что абстрактный метод обязателен для переопределения во всех подклассах. Фактически, он контролируется во время компиляции, чтобы убедиться, что определен в подклассах. Опять же, это отличный способ создать базовый класс для чего-то, сохраняя при этом определенный контроль над тем, что должны делать подклассы. Имея это в виду, вы всегда можете рассматривать подкласс как его базовый класс, когда вам нужно использовать методы, определенные как абстрактные методы в базовом классе. Например, рассмотрим следующий пример:
namespace AbstractClasses
{
class Program
{
static void Main(string[] args)
{
System.Collections.ArrayList animalList = new System.Collections.ArrayList();
animalList.Add(new Dog());
animalList.Add(new Cat());
foreach(FourLeggedAnimal animal in animalList)
Console.WriteLine(animal.Describe());
Console.ReadKey();
}
}
abstract class FourLeggedAnimal
{
public abstract string Describe();
}
class Dog : FourLeggedAnimal
{
public override string Describe()
{
return "I'm a dog!";
}
}
class Cat : FourLeggedAnimal
{
public override string Describe()
{
return "I'm a cat!";
}
}
}
Как вы можете видеть, мы создаем ArrayList, содержащий наших животных. Затем мы создаем новые экземпляры dog и cat и добавляем их в список. Они создаются как собака и кошка соответственно, но они также имеют Тип FourLeggedAnimal, и поскольку компилятор знает, что подклассы этого класса содержат метод Describe (), вам действительно разрешено вызывать этот метод, не зная точного типа animal. Так что по типажу FourLeggedAnimal, в цикле foreach мы получаем доступ к членам классов. Это может быть очень полезно во многих сценариях.