русс | укр

C# - Головна
Контакти
Задайте питання...
Перегляд всіх питань


Простір імен
  ► System (5)
  ► Microsoft (1)


Для учнів (початківців)
  ► Відео уроки (4)
  ► Навчання (177)
  ► Приклади програм (19)
  ► Секрети Сі Шарп (4)

Для професіоналів
  ► Навчання (6)
  ► Приклади програм (1)










Спадкування C#

Спадкування — один з трьох фундаментальних принципів об'єктно-орієнтованого програмування, оскільки саме завдяки йому можливо створення ієрархічних класифікацій. Використовуючи спадкування, можна створити загальний клас, який визначає характеристики, властиві безлічі пов'язаних елементів. Цей клас потім може бути успадкований іншими, вузькоспеціалізованими класами з додаванням до кожного з них своїх унікальних особливостей.

В мові С# клас, який успадковується, називається базовим. Клас, який успадковує базовий клас, називається похідним. Отже, похідний клас — це спеціалізована версія базового класу. У похідний клас, що успадковує всі змінні, методи, властивості, оператори і індексатори, визначені в базовому класі, можуть бути додані унікальні елементи.

З# підтримує спадкування, дозволяючи оголошення класу вбудовувати інший клас. Це реалізується за допомогою завдання базового класу при оголошенні похідного. Краще всього почати з прикладу. Розглянемо клас TwoDShape, в якому визначаються атрибути "узагальненої" двовимірної геометричної фігури {наприклад, квадрата, прямокутника, трикутника тощо).

 

// Клас двовимірних об'єктів, class TwoDShape {

public double width;

public double height;

public void showDiraO {

Console.WriteLine("Ширина і висота дорівнюють " + width + " і " + height);

)

}

 

Клас TwoDShape можна використовувати в якості базового (т. е. як стартовий майданчик) для класів, які описують специфічні типи двовимірних об'єктів. Наприклад, у наступній програмі клас TwoDShape використовується для виведення класу Triangle. Зверніть увагу на те, як оголошується клас Triangle. // Проста ієрархія класів.

using System;

// Клас двовимірних об'єктів. class TwoDShape {

public double width;

public double height;

public void showDimO {

Console.WriteLine("Ширина і висота дорівнюють " + width + " і " + height);

>

)

II Клас Triangle виводиться з класу TwoDShape. class Triangle : TwoDShape \

public string style; // Тип трикутника.

// Метод повертає площа трикутника, public double area() {

return width * height / 2;

}

// Відображаємо тип трикутника, public void showStyleO {

Console.WriteLine("Трикутник " + style);

>

}

class Shapes {

public static void Main() ( Triangle tl - new Triangle(); Triangle t2 = new Triangle();

tl.width = 4.0;

tl.height = 4.0;

tl.style = "рівнобедрений";

t2.width = 8.0;

t2.height - 12.0;

t2.style - "прямокутний";

Console.WriteLine("Інформація про tl: "); tl.showStyleO ; tl.showDimt);

Console.WriteLine("Площа дорівнює " + tl.area{)); Console.WriteLine();

Console.WriteLine("Інформація про t2: "); 12.showStyleO ; t2.showDira();

Console.WriteLine("Площа дорівнює " + t2.area());

)

}

Ось результати роботи цієї програми. Інформація про t1: Трикутник рівнобедрений Ширина і висота дорівнюють 4 і 4 Площа дорівнює 8

Інформація про t2: Трикутник прямокутний Ширина і висота дорівнюють 8 і 12 Площа дорівнює 48

В класі Triangle створюється специфічний тип об'єкта класу TwoDShape, в даному випадку трикутник. Клас Triangle містить всі елементи класу TwoDShape і, крім того, поле style, метод area () і метод showStyle О. У змінній style зберігається опис типу трикутника, метод area про обчислює і повертає його площа, а метод showStyle () відображає дані про тип трикутника.

Нижче наведено синтаксис, який використовується в оголошенні класу Triangle, щоб зробити його похідним від класу TwoDShape. | class Triangle : TwoDShape {Цей синтаксис можна узагальнити. Якщо один клас успадковує інший, то ім'я базового класу вказується після назви похідного, причому імена класів розділяються двокрапкою. В С# синтаксис успадкування класу дуже простий для запам'ятовування і використання.

Оскільки клас Triangle включає всі члени базового класу TwoDShape, він може звертатися до членів width і height всередині методу агеа(). Крім того, всередині методу Main () об'єкти tl і t2 можуть прямо посилатися на члени width і height, як якщо б вони були частиною класу Triangle. Незважаючи на те, що класу TwoDShape є базовим для класу Triangle, це абсолютно незалежний і автономний клас. Те, що його використовують у якості базового похідний клас (класи), не означає неможливість використання його самого. Наприклад, наступний фрагмент коду абсолютно легальний:

 

TwoDShape shape = new TwoDShape();

shape.width = 10; shape.height = 20;

shape.showDim();

 

Безумовно, об'єкт класу TwoDShape "нічого не знає" та не має права доступу До класу, похідним від TwoDShape.

Загальна форма оголошення класу, який успадковує базовий клас, має такий вигляд:

class имя_производного_класса : имя_базо&ого_класса { // тіло класу

}

 

Для створюваного похідного класу можна вказати тільки один базовий клас. В С# (на відміну від С++) не підтримується спадкування декількох базових класів в одному похідному класі. Цей факт необхідно враховувати при перекладі З++-коду на С#. Однак можна створити ієрархію спадкування, в якій один похідний клас стає базовим для іншого похідного класу. І звичайно ж, жоден клас не може бути базовим (ні прямо, ні опосередковано) для самого себе.

Основна перевага спадкування полягає в тому, що, створивши базовий клас, який визначає загальні атрибути для безлічі об'єктів, його можна використовувати для створення будь-якого числа більш спеціалізованих похідних класів. В кожному похідному класі можна потім точно "налаштувати" власну класифікацію. Ось, наприклад, як з базового класу TwoDShape можна вивести похідний клас, який інкапсулює прямокутники:

// Клас прямокутників Rectangle, похідний //від класу TwoDShape. class Rectangle : TwoDShape {

// Метод повертає значення true, якщо // прямокутник є квадратом, public bool isSquare Про {

if(width == height) return true; return false;

)

II Метод повертає значення площі прямокутника, public double area Про ( return width * height;

)

}

Клас Rectangle включає класу TwoDShape і додає метод isSquareO, який визначає, чи є прямокутник квадратом, і метод агеа(), що обчислює площу прямокутника.


Поліморфізм C#

 

Поліморфізм (від грецького слова polymorphіsm, що означає "багато форм") — це якість, яка дозволяє одному інтерфейсу отримувати доступ до цілого класу дій. Простим прикладом поліморфізму може послужити кермо автомобіля. Кермо (інтерфейс) залишається кермом незалежно від того, який тип рульового механізму використовується в автомобілі. Іншими словами, кермо працює однаково в будь-якому випадку: оснащений ваш автомобіль рульовим управлінням прямої дії, рульовим управлінням з підсилювачем або рейковим управлінням. Таким чином, поворот керма вліво змусить автомобіль поїхати вліво незалежно від типу використовуваного в ньому рульового управління. Гідність такого однакового інтерфейсу полягає, безумовно, в тому, що, якщо ви знаєте, як поводитися за кермом, ви зможете водити автомобіль будь-якого типу.

Той же принцип можна застосувати і до програмування. Розглянемо, наприклад, стек (stack), тобто область пам'яті, що функціонує за принципом "останнім прийшов — першим обслужений". Припустимо, ви пишете програму, для якої потрібно організувати три різних типи стека. Один стек призначений для цілочисельних значень, другий — для значень з плаваючою точкою, а третій — для символів. В цьому випадку для реалізації кожного стека використовується один і той же алгоритм, незважаючи на розходження в типах збережених даних. У разі не об'єктно-орієнтованої мови вам довелося б створити три набору "стекових" підпрограм, що мають різні імена. Але завдяки поліморфізму в середовищі С# можна створити один загальний набір "стекових" підпрограм, який обробляє всі три типи стека. Іншими словами, знаючи, як використовувати один стек, можна використовувати всі інші.

Концепцію поліморфізму часто висловлюють такою фразою: "один інтерфейс — багато методів". Це означає, що для виконання групи подібних дій можна розробити загальний інтерфейс. Поліморфізм дозволяє знизити ступінь складності програми, надаючи програмісту можливість використовувати один і той же інтерфейс для завдання загального класу дій. Конкретне (потрібне в тому чи іншому випадку) дія (метод) вибирається компілятором. Програмісту немає необхідності робити це вручну. Його завдання — правильно використовувати загальний інтерфейс.

 

Переглядів: 4188






© 2012 ci-sharp.ru При використанні матеріалу пряме iндексуюче посилання на сайт ОБОВ'ЯЗКОВЕ.
Права строго захищені нормами міжнародного права, інтелектуальної власності та авторського права.