TOC

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 мы получаем доступ к членам классов. Это может быть очень полезно во многих сценариях.


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!