Четвер, 21.11.2024, 16:36
Гость

Мішатронік

Мобільна версія | Додати у вибране  | Мій профіль | Вихід | RSS |
Меню сайту
Наше опитування
Хто ви?

Всього відповідей: 10
Статистика

Онлайн всього: 2
Гостей: 2
Користувачів: 0


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

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

 

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

 
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";
 

 

Форма входа
Пошук
Друзі сайту
Календар
«  Листопад 2024  »
ПнВтСрЧтПтСбНд
    123
45678910
11121314151617
18192021222324
252627282930

Єдина Країна! Единая Страна!