Опубликован: 14.12.2009 | Уровень: для всех | Доступ: платный
Лекция 4:

Пространства имен и почтовая служба

< Лекция 3 || Лекция 4: 12 || Лекция 5 >

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

Так как этот курс адресован тем, кто только начинает знакомиться с искусством программирования, мы не станем рассматривать слишком сложные вещи, поэтому расскажем о наследовании немного.

Иногда вам будет встречаться объявление классов следующего вида:

class MyFancyClass : Form
{
...
}

Сравните его с обычным объявлением класса:

class MyFancyClass
{
...
}

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

Наследование среди людей

Человек, как правило, наследует определенные качества от своих родителей. У вас может быть цвет волос как у мамы, а нос — папин.


Это не означает, что вы полностью похожи на своих родителей. Несомненно, вы обладаете различными уникальными качествами и способностями, но определенные свойства характера и физические особенности "заложены" в вас при рождении.

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

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

Приведем пример. Определим два класса — 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, но для них действуют те же правила доступа, что и для полей. Производный класс может вызывать любые методы в родительском классе, если они не объявлены закрытыми.

Наследование возможностей работы с окнами

Предположим, вам нужно написать программу, выполняемую в обычном окне, и понадобятся возможности изменения размера окна, его разворачивания, сворачивания, перетаскивания и некоторые другие. Имеет смысл, чтобы ваш класс "наследовал" возможности класса, который уже работает с подобным типом интерфейса. Обычным выбором родительского класса становится класс System.Windows.Forms.Form.

В таком случае пишем:

class MyFancyClass : Form
{
...
}

Фактически мы говорим: "Я создаю собственный класс, но он должен автоматически наследовать все возможности класса Form ".

Когда следует использовать наследование

Для использования класса совсем не обязательно наследовать от него поля! Наследование лучше всего подходит для тех случаев, когда то, чего вы пытаетесь добиться, можно получить от существующего класса, дополнительно расширив его или настроив.

Строительный блок: Наследование
Класс может наследовать свойства и действия другого класса.
public class Musician
{
  public string name;
  public int age;
  public bool canSing;
}
Класс "Guitarist" наследует все поля из класса "Musician", а кроме того, имеет два собственных поля.

Имя класса Musician, написанное после двоеточия, сообщает компьютеру, что новый класс "Guitarist" наследует поля и методы родительского класса "Musician".

public class Guitarist : Musician
{
  public string guitarType;
  public string guitarBrand;
}
Создав объект класса Guitarist, можно установить его свойства, если они являются открытыми для доступа.
Guitarist g = new Guitarist();
g.name = "Jimbo van Helsdingen";
g.age = 28;
g.canSing = false;
g.guitarType = "Acoustic";
g.guitarBrand = "Gibson";
< Лекция 3 || Лекция 4: 12 || Лекция 5 >
Алексей Фролов
Алексей Фролов
Кристина Горбунова
Кристина Горбунова
Robert Hirsch
Robert Hirsch
Германия, Worzeldorf
Илья Фурса
Илья Фурса
Россия, Самара