Скачиваний:
29
Добавлен:
26.03.2016
Размер:
429.43 Кб
Скачать

Int point; // поле

// Конструктор похідного класу із застосуванням base: у базовий клас конструктору передаються

// аргументи x, у, z, тобто перший параметр конструктора бере участь в обчисленні поля спадкоємця,

// останні три - в обчисленні полів батька

public inherite_class(int point, int x, int у, int z) : base(x, у, z)

{

this.point = point; // Ініціалізував поле спадкоємця

}

// Метод класу-спадкоємця

public void Pointer(inherite_class new_point)

{

// Встановлення полів базового класу в спадкоємцеві:

new_point.x += new_point.point;

new_point.y += new_point.point;

new_point.z += new_point.point;

Console.WriteLine("Нові координати об'єкту " + "у похідному класі: {0} {1} {2}",

new_point.x, new_point.y, new_point.z);

}

}

class Program

{

static void Main()

{

Console.WriteLine("Робота з ключовим " + "словом base\n");

inherite_class obj = new inherite_class(5, 2, 3, 4);

Console.WriteLine("Координати об'єкта в базовому " + "класі: {0} {1} {2}",

obj.x, obj.y, obj.z);

obj.Pointer(obj);

Console.ReadLine();

}

}

}

Рис. 8.8. Робота з ключовим словом base

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

А зараз розглянемо коротко основні принципи дії ключового слова base. Коли в похідному класі вказується ключове слово base, викликається конструктор з його безпосереднього базового класу. Отже, ключове слово base завжди звертається до базового класу, що стоїть в ієрархії безпосередньо над викликаючим класом. Аргументи передаються базовому конструктору як аргументи методу base(). Якщо ж ключове слово відсутнє, то автоматично викликається конструктор, використовуваний в базовому класі за замовчуванням.

Додавання до класу запечатаного класу

Ми бачили, що запечатаний клас не спадкується. А хотілося б в деяких ситуаціях все-таки якось використовувати його члени у своєму створюваному класі. Як це зробити? Згадуємо, спадкоємство не проходить. Для вирішення цієї проблеми застосовується прийом включення у створюваний клас об'єкта, який отримується із запечатаного класу. Програма, яка реалізовує сказане, приведена в лістингу 8.12, а результат її роботи показаний на рис. 8.9.

Лістинг 8.12

using System;

namespace app29_include_sealed

{

sealed public class A

{

int a; // Поля

int b;

// Властивості

public int A_a

{

get { return a; }

set { a = value; }

}

public int A_b

{

get { return b; }

set { b = value; }

}

// Конструктор

public A(int а, int b) { this.a = a; this.b = b; }

// Метод

public int M_A()

{

return (a + b);

}

}

class B

{

public int c;

public A ab = new A(15, 20);

public B(int cc)

{

c = cc;

}

}

class Program

{

public static void Main()

{

B ba = new B(5);

int sum = ba.c + ba.ab.M_A();

Console.WriteLine("Використання запечатаного " + "класу\nяк об'єкта створюваного");

Console.WriteLine("Поле з класу В = {0}", ba.c);

Console.WriteLine("Поля запечатаного класу А " + "рівні {0}, {1}", ba.ab.A_a, ba.ab.A_b);

Console.WriteLine("Результат додавання поля " + "із В і роботи методу із А: {0}", sum);

// TODO: Implement Functionality Here

Console.Write("Press any key to continue... ");

Console.Read();

}

}

}

Отже, є запечатаний клас А з двома полями, доступ до яких здійснюється тільки через дві відповідні властивості — А_а і А_b. У класі А є метод M_a(), що підсумовує значення закритих полів класу А. Ми будуємо клас В з одним полем с та об'єктом ab, який отримується із запечатаного класу А. Виведення даних на екран показує що в класі В використовується функціональність класу А (зокрема метод M_a()), хоча спадкоємства не було, бо воно неможливе через запечатаність А. Відмітимо, що якщо об'єкт одного класу вкладений в об'єкт іншого класу, то доступ до елементів вкладеного об'єкта йде через крапку від імені об'єкта (це загальне правило), а саме ім'я об'єкта, яке визначає членство об'єкта в іншому класі, йде через крапку від імені об'єкта основного класу. У нашому випадку, щоб дістатися до властивості А_а із запечатаного класу, треба було записати ba.ab.A_a.

Рис. 8.9. Результат використання запечатаного класу у створюваному класі