АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Статичний контроль типів і динамічне зв'язування

Розглянемо сімейство класів A 1, A 2,... An, пов'язаних зв’язком успадкування. Клас Ak +1 є прямим нащадком класу Ak. Нехай створено послідовність об'єктів x 1, x 2,... xn, де xk – об'єкт класу Ak. Нехай у класі A 1 створено метод M з модифікатором virtual, перевизначений усіма нащадками, так що в рамках сімейства класів метод M існує в n формах, кожна з яких задає реалізацію методу, обрану відповідним нащадком. Розглянемо основну операцію, ініціація об'єктного обчислення – виклик об'єктом методу класу: x1.M (arg1, arg2,... argN).

Контролем типів називається перевірка кожного виклику, що засвідчує, що [5]:

1. В класі A 1 об'єкта x 1 дійсно мається метод M.

2. У методі М дійсно N формальних аргументів.

3. Список фактичних аргументів на точці виклику відповідає за кількістю і типами списку формальних аргументів методу M, заданого в класі A 1.

Контроль типів, що виконується на етапі компіляції, називається статичним контролем типів.

Перейдемо до розгляду динамічного зв'язування. І знову розглянемо основну операцію – виклик x1.M (arg1, arg2,... argN).

Припустимо, що статичний контроль типів для цього виклику успішно виконано. Розглянемо ще один аспект, пов'язаний з цим викликом. Згадаймо, що x 1 – це посилання, яке пов'язане з об'єктом, розташованим у динамічній пам'яті. Чи завжди збігається тип об'єкту і тип посилання? Іншими словами, чи завжди об'єкт, створений у динамічній пам'яті, належить класу A 1? Відповідь: ні, не завжди.

Метод M є поліморфним, якщо маючи одне і те ж ім'я і сигнатуру, він існує в різних формах – для кожного класу задана власна реалізація методу. Виникає природне запитання, який же метод M слід викликати – метод класу A 1 (метод посилання) або метод того класу, якому належить реальний об'єкт у динамічній пам'яті (метод об'єкта). Можливі два рішення цього питання, і обидва варіанти використовуються на практиці.

Статичним зв'язуванням називається зв'язування мети виклику і викликаного методу на етапі компіляції, коли з сутністю зв'язується метод класу, заданий при оголошенні сутності – метод посилання.

Динамічним зв'язуванням називається зв'язування мети виклику і викликаного методу на етапі виконання, коли з сутністю зв'язується метод класу об'єкта, пов'язаний із класом в момент виконання – метод об'єкта.

При статичному зв'язуванні метод вибирається з класу сутності, при динамічному – з класу об'єкта, пов'язаного із сутністю. Зрозуміло, що на етапі компіляції можливо тільки статичне зв'язування, оскільки тільки в період виконання можна визначити, з об'єктом якого класу пов'язана дана сутність. Це може бути клас будь-якого з нащадків класу сутності. Для того, щоб виконувалося динамічне зв'язування, батьківський клас, що вперше створює метод, повинен забезпечити метод модифікатором virtual або abstract, в класах нащадках такий віртуальний метод буде мати модифікатор override.


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.)