- •Вопросы на модульную контрольную №2
- •По дисциплине «Объектно-ориентированная парадигма»
- •Перегрузка операций. Общие положения.
- •Перегрузка унарных операций в с#.
- •Перегрузка бинарных операций в с#.
- •Перегрузка операторов приведения типа в с#
- •Индексаторы в с#. Перегрузка индексаторов.
- •Свойства в с#.
- •Наследование. Общие положения.
- •Реализация одиночного наследования в с#.
- •Полиморфизм. Общие положения.
- •Позднее связывание. Виртуальные функции.
- •Особенности описания и использования виртуальных функций в с и с#
- •Различия между перегруженными и виртуальными функциями.
- •Переопределение виртуальных функций в с#.
- •Абстрактные классы. Чистые виртуальные функции.
- •Интерфейсы. Общие положения.
- •Реализация интерфейсов. Использование интерфейсных ссылок.
- •Обработка исключительных ситуаций. Общие положения.
- •Повторная генерация исключений. Вложенные блоки try.
Реализация одиночного наследования в с#.
Наслідування в С# відбувається коли в похідному класі ми після назви самого класа ставимо дві крапки «:» і пишемо назву класа який у нас є базовим.
Приклад:
class base_class
{
public int i;
}
class other_class:base_class
{
void test()
{
i=2;
}
}
Переопределение наследованных членов в языках С++ и С#.
В С++ ми можемо злегкістю перевизначати наслідувальні члени новими членами вже похідного класу.
Крім того, ми можемо отримати доступ до члена данних який був визначений у базовому класі.
Приклад:
class base_class
{
public: int i;
}
class other_class:public base_class
{
public: int i;
}
void main()
{
other_class obj;
obj.i=3; //доступ до перевизначеного похідного члена-данних
obj. base_class::i=5; //доступ до базового члена-данних }
В С# по суті перевизначення відбувається аналогічно С++. Але в випадку коли ми напишемо в похідному класі саме перевизначення таким чином public: int i,то компілятор видасть нам повідомлення в якому буде попереджати, що член-данних і який був в базовому класі буде скритим. Для уникнення таких повідомлень слід писати ключове слово new перед перевизначенням. Для того щоб отримати доступ до базового члена-данних нам потрібно використати ключове слово base.
Приклад.
class base_class
{
public int i;
}
class other_class: base_class
{
public new int i;
public void test()
{
i=2; //доступ до перевизначеного похідного члена-данних
base.i=3; //доступ до базового члена-данних }
}
Приведение типов в иерархии наследования в языках С++ и С#.
В С++ для того щоб привести об’єкти ми повинні використовувати вказівники.
base_class *obj1=new base_class();
other_class *obj2=new other_class();
obj2=(other_class *)obj1;
obj1=(base_class *)obj2;
obj1= obj2;
В С# для того щоб привести об’єкт базового класа до похідного викоритовують явне приведення.
obj2 = (other_class)obj1; // obj1-об’єкт базового класа(base_class), obj2-об’єкт похідного класа(other_class).
І навпаки НЕявно коли приводиться об’єкт похідного класу до базового
obj1 =obj2; // obj1-об’єкт базового класа(base_class), obj2-об’єкт похідного класа(other_class).
Открытое, защищенное и закрытое наследование в С++.
Від того з яким специфікатором похідний клас наслідує базовий і буде залежати який рівень доступу буде мати члени-данних базового класу у об’єктах похідного. Але на рівень доступу також впливає,те який специфікатор використовував кожен член данних в базовому класі.
В С++ ми можемо за допомогою спецільного опису змінити рівень доступу до унаслідуваного члена-данних.
Приклад:
class base_class
{public: int i;}
class other_class: private base_class
{public: base_class::i;}
В цьому прикладі по при те, що клас наслідується специфікатором private, він повертається у похідному класі до рівня доступу public.
Множественное наследование в С++.
Похідний клас у С++ може наслідувати декілька базових класів.
Прицьому кожен з різними специфікаторами.
Приклад:
class base1_class {…}
class base2_class {…}
class other_class: private base1_class, public base2_class {…}
Реализация наследования на основе прямых базовых классов в С++.
Н а схемі зображено, що клас А прямо наслідує клас В та клас С.
Реализация наследования на основе непрямых разделенных базовых классов в С++.
Н а схемі зображано, що клас А прямо наслідує клас В,а клас В в свою чергу прямо наслідує клас С, а ось клас А непрямо наслідує клас С.
Реализация наследования на основе непрямых виртуальных базовых классов в С++.
П рипустимо ситуацію в якій клас А наслідує два класа В,С, а вони в свою чергу наслідують клас BASE. В цьому випадку у об'єкта класу А буде «дві копіі» членів данних класу BASE. Тому якщо в класі BASE буде зміннна,наприклад, i, то в класі А ми не зможемо до неї просто дістатися. Нам потрібно буде кожного разу вказувати з якого класу брати цю змінну.Наприклад, B::i або С::і.
Але коли нам потрібно тільки одна копія класу BASE, то потрібно вказувати коли клас В і С наслідують клас BASE, що він був virtual тобто мав одну копію. Тоді в класі А, ми можемо звертатися до змінно і, як до звичайної, тому що копія її тепер одна.