Читайте также:
|
|
Розглянемо клас, названий Found, який у наших прикладах буде відігравати роль батьківського класу:
/// <summary>
/// Батьківський клас
/// </summary>
class Found
{
//fields
protected string name;
protected int credit;
static protected int count;
const string NL = "\r\n";
// Constructors
public Found()
{
name = "Nemo";
credit = 0;
count++;
}
public Found(string name, int credit)
{
this.name = name;
this.credit = credit;
count++;
}
}
Клас Found має три поля. Поля є закритими для клієнтів класу, але вони відкриті для нащадків. Це правильна стратегія. Нащадкам слід дозволяти прямий доступ до полів. Одне з полів є статичним, змістовно воно буде використовуватись для підрахування кількості створених об’єктів класу Found клієнтами класу. Окрім конструктора з аргументами, які передаються для ініціалізації екземплярних полів класу, у класу є конструктор без аргументів, які ініціалізують поля класу деякими заданими за замовчуванням способом. Обидва конструктора у процесі роботи збільшують на одиницю значення статичного поля, яке к цьому часу вже створено та ініціалізовано, оскільки статичний конструктор класу визивається за замовчування до того, як визиваються конструктори, що створюють екземпляри — об’єкти класу.
Нащадок класу, успадкувавши від батьківського класу будь який метод, може його перевизначити, задавши власну реалізацію, яка відрізняється від реалізації, яка використовується батьком. Перевизначаємий метод батька повинен забезпечуватися модифікатором override.
Хоча явно для класу Found батьківський клас не заданий, але батько є у кожного класу. Якщо прямий батько не заданий, то такий є клас object. Клас Found успадкував від свого батька — класу object ряд методів. Частіше за все методи, успадковані від object, нащадок повинен перевизначити, і в першу чергу це стосується методу ToString. Як правило, перевизначення цього методу приводиться до того, що рядок, який повертається, містить інформацію про значення, які зберігаються у полях класу. Ось як виглядає перевизначаємий метод ToString для класу Found:
public override string ToString()
{
string s = "Поля: name = {0}, credit = {1}";
return String.Format(s, name, credit);
}
Почнемо додавати до класу Found власні методи:
public string NonVirtMethod()
{
return "Found: " + this.ToString();
}
Це звичайний метод класу. Він повертає деякий рядок, отриманий конкатенацією константи та рядка, що є результатом виклику щойно перевизначеного методу ToString. Ім’я методу уточнено іменем поточного об’єкта this, щоб підкреслити той факт, що саме поточний об’єкт викликає метод класу ToString.
Додамо до класу ще один схожий метод:
public virtual string VirtMethod()
{
return "Found: " + this.ToString();
}
Тіла методів, як бачите, нічим не відрізняються. Але до заголовку другого методу додане ключове слово virtual. І хочу для об’єктів класу Found виклик спільних методів буде давати однаковий результат, з позиції наслідування ці методи суттєво відрізняються. Розуміння сакрального сенсу методів, визначених віртуальними, є основною метою даної лекції. Але про це поговоримо пізніше, коли будуть створюватися нащадки класу Found. Зараз відмітимо, що деякі методи класу можна об’явити з модифікатором virtual, таким чином відносячи їх до віртуальних методів.
Додамо ще один метод класу:
public string Parse()
{
return "Розбір коду виконаний!";
}
Метод прости та нехитрий — повертає деякий рядок. Реально в цьому прикладі будуються методи, які називаються „заглушками“. Вони не виконують ніякої змістовної роботи, але видають інформацію про те, що метод пропрацював. Для мети нашої лекції цього цілком достатньо.
Тепер розглянемо більш складний метод:
public string Job()
{
string res = "";
res += "VirtMethod: " + VirtMethod();
res += "NonVirtMethod: " + NonVirtMethod() + NEWLINE;
res += "Parse: " + Parse() + NL;
return res;
}
Метод Job почергово викликає методи класу — VirtMethod, NonVirtMethod, Parse. Рядки, які задають результати цих методів, об’єднуються, і отриманий рядок повертається у якості результату метода Job.
Останній метод, який ми додамо до класу Found, — це статичний метод, який повертає інформацію із статичного поля класу:
public static string NumberOfObjects()
{
return "Об’єктів створено: " + count;
}
Дата добавления: 2015-08-18; просмотров: 77 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Лабораторна робота 1. Повторення принципів ООП. Зв’язки між класами. | | | Добавление и скрытие полей потомком |