
- •Ключове слово this
- •Ключове слово static
- •Статичний конструктор
- •Інкапсуляція з використанням методів get і set
- •Інкапсуляція з використанням властивостей
- •Організація робіт при описі класу. Атрибут partial
- •Спадкоємство
- •Int point; // поле
- •Додавання до класу запечатаного класу
- •Вкладеність класів
- •Поліморфізм
- •Абстрактні класи
- •Приховування членів класу
- •Оператори as і is
- •Структури
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. Результат використання запечатаного класу у створюваному класі