Наследование кода


При написании программного кода было бы полезно иметь возможность наследования всего набора способностей существующего класса, будь то собственный класс или чей-то еще.

Приведем пример. Определим два класса — Animal и Bird. Класс Bird объявим наследником класса Animal.

class Animal

{

//Поля класса

public string kindOfAnimal;

public string name;

public int numberOfLegs;

public int height;

public int length;

public string color;

bool hasTail;

protected bool isMammal;

private bool spellingCorrect;

}

// Класс "Bird" — наследник класса "Animal"

class Bird : Animal

{

public string featherColor;

}

В реальном мире птица — это вид животного, но у птиц есть свои отличительные признаки, характерные только для них. Тогда имеет смысл классу Bird наследовать все признаки класса Animal и стать обладателем ряда дополнительных признаков. В данном случае мы определим одно специальное поле, характерное для птиц, — featherColor— цвет перьев.

Итак, пишем:

class Bird : Animal

{

...

}

Таким образом мы сообщаем следующее: "Я определяю новый класс Bird, но он должен автоматически наследовать все свойства класса Animal ". Иными словами, класс Birdявляется производным от класса Animal.

При создании экземпляра Bird мы можем обращаться как к полям, определенным в классе Bird, так и к наследуемым полям класса Animal, конечно, если эти поля не являются закрытыми:

Bird b = new Bird();

b.kindOfAnimal = "Орел";

b.isMammal = false;

b.featherColor = "темно-желтый";

Примечание редактора. Это фрагмент кода, о корректности которого нельзя судить без знания контекста. Доступ к свойствам зависит от того, где появляется приведенный выше текст: если из метода класса Bird, то доступ к защищенному ( protected ) свойству isMammal разрешен, поскольку класс Bird — потомок классаAnimal ; если же из метода класса клиента, то это свойство будет недоступно.

Более важное замечание: о наследовании можно говорить, только когда объекты двух классов связаны отношением "является". Каждая птица (объект класса Bird ) является животным (объектом класса Animal ). Поэтому класс Bird может быть объявлен наследником класса Animal, но класс Car, автомобили, нельзя объявлять наследником класса Animal, поскольку автомобили не являются животными.

Для простоты мы не включили в программу объявление методов в классах Animal и Bird, но для них действуют те же правила доступа, что и для полей. Производный классможет вызывать любые методы в родительском классе, если они не объявлены закрытыми.