Семантика привласнення

Розглянемо привласнення: x = e.

Щоб привласнення було допустимим, типи змінної x і вирази e повинні бути узгодженими. Хай суть x згідно оголошенню належить класу T. Говоритимемо, що тип T заснований на класі T і є базовим типом x, так що базовий тип визначається класом оголошення. Хай тепер в привласненні, що розглядається нами, вираз e пов'язаний з об'єктом типу T1.

Визначення: тип T1 узгоджений по привласненню з базовим типом T змінної x, якщо клас T1 є нащадком класу T.

Привласнення допустиме, якщо і тільки якщо має місце узгодження типів. Оскільки всі класи в мові C# — вбудовані і визначені користувачем — за визначенням є нащадками класу Object, то звідси і слідує наш окремий випадок: змінним класу Object можна привласнювати вирази будь-якого типу.

Не дивлячись на те, що грунтовна розмова про спадкоємство, батьків і нащадків нас ще чекає, краще із самого початку розуміти відносини між батьківським класом і класом-нащадком, відношення між об'єктами цих класів. Клас-нащадок при створенні успадковує всі властивості і методи батька. Батьківський клас не має можливості успадковувати властивості і методи, що створюються його нащадками. Спадкоємство — це одностороння операція від батька до нащадка. Ситуація з привласненням — симетрична. Об'єкту батьківського класу привласнюється об'єкт класу-нащадка. Об'єкту класу-нащадка не може бути привласнений об'єкт батьківського класу. Привласнення — це одностороння операція від нащадка до батька. Одностороннє привласнення реально означає, що посилальна змінна батьківського класу може бути пов'язана з будь-якими об'єктами, що мають тип нащадків батьківського класу.

Наприклад, хай заданий деякий клас Parent, а клас Child — його нащадок, оголошений таким чином:

class Child:Parent {...}

Хай тепер в деякому класі, що є клієнтом класів Parent і Child, оголошені змінні цих класів і створені пов'язані з ними об'єкти:

Parent p1 = new Parent(), p2 = new Parent();Child ch1 = new Child(), ch2 = new Child();

Тоді допустимі привласнення р1 = p2; p2= p1; ch1=ch2; ch2 = ch1 p1 = ch1; p1 = ch2

Але недопустимі привласнення ch1 = p1; ch2 = p1; ch2 = p2;

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

p1 = ch1;... ch1 = (Child)p1;

Семантика привласнення справедлива і для іншого важливого випадку - при розгляді відповідності між формальними і фактичними аргументами процедур і функцій. Якщо формальний аргумент згідно оголошенню має тип T, а вираз, задаючий фактичний аргумент, має тип T1, то має місце узгодження типів формального і фактичного аргументів, якщо і тільки якщо клас T1 є нащадком класу T. Звідси негайно витікає, що якщо формальний параметр процедури належить класу Object, то фактичний аргумент може бути виразом будь-якого типу.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: