This article has been localized into Russian by the community.
Абстрактные классы
Абстрактные классы, обозначаемые в определении класса ключевым словом abstract, обычно используются для определения базового класса в иерархии. Особенность абстрактного класса состоит в том, что нельзя создать его экземпляр. Иначе вы получите сообщение об ошибке. Вместо экземпляра, нужно создать производный класс от абстрактного, как указано в разделе о наследовании, и создать экземпляр этого производного класса.
Честно говоря, вы можете долго обходиться без абстрактных классов, но они отлично подходят для таких специфических вещей как frameworks, поэтому вы найдете немного абстрактных классов в рамках .NET framework. Абстрактные классы очень часто, если не всегда, используются для определения чего-то абстрактного, что является скорее концепцией, чем конкретным предметом.
В этом примере мы создадим базовый класс четвероногих животных и тогда создадим наследующий от него класс Dog:
namespace AbstractClasses
{
class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
Console.WriteLine(dog.Describe());
Console.ReadKey();
}
}
abstract class FourLeggedAnimal
{
public virtual string Describe()
{
return "Not much is known about this four legged animal!";
}
}
class Dog : FourLeggedAnimal
{
}
}
Если вы сравните его с примером из главы о наследовании, то найдете не много отличий. Фактически Наибольшим из них является слово abstract в начале определения FourLeggedAnimal. Как видите, мы создали новый экземпляр класса Dog и тогда вызвали из класса FourLeggedAnimal унаследованный метод Describe().
FourLeggedAnimal someAnimal = new FourLeggedAnimal();
Вы получите это милое сообщение об ошибке.
Нельзя создать экземпляр абстрактного класса или интерфейс 'AbstractClasses.FourLeggedAnimal'
Теперь, как видите, мы просто унаследовали метод Describe(), но для класса Dog он не очень полезен в его теперешней форме. Давайте откорректируем его:
class Dog : FourLeggedAnimal
{
public override string Describe()
{
return "This four legged animal is a Dog!";
}
}
Сейчас мы сделали полную коррекцию, но иногда вы можете использовать действия базового класса в добавление новой функциональности. Это может быть сделано применением базового слова, указывающего на класс, от которого наследуется.
abstract class FourLeggedAnimal
{
public virtual string Describe()
{
return "This animal has four legs.";
}
}
class Dog : FourLeggedAnimal
{
public override string Describe()
{
string result = base.Describe();
result += " In fact, it's a dog!";
return result;
}
}
Очевидно, что теперь вы можете создавать другие подклассы FourLeggedAnimal, возможно, cat или lion. В следующей главе мы приведем более продвинутый пример наследования и также абстрактных методов. Читайте дальше.