TOC

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. В следующей главе мы приведем более продвинутый пример наследования и также абстрактных методов. Читайте дальше.

This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!