|
Розглянемо сімейство класів A1, A2,... An, пов'язаних зв’язком успадкування. Клас Ak +1 є прямим нащадком класу Ak. Нехай створено послідовність об'єктів x1, x2,... xn, де xk - об'єкт класу Ak. Нехай у класі A1 створено метод M з модифікатором virtual, перевизначений усіма нащадками, так що в рамках сімейства класів метод M існує в n формах, кожна з яких задає реалізацію методу, обрану відповідним нащадком. Розглянемо основну операцію, ініціація об'єктного обчислення - виклик об'єктом методу класу:
x1.M (arg1, arg2,... argN)
Контролем типів називається перевірка кожного виклику, що засвідчує, що:
1. В класі A1 об'єкта x1 дійсно мається метод M;
2. У методі М дійсно N формальних аргументів;
3. Список фактичних аргументів на точці виклику відповідає за кількістю і типами списку формальних аргументів методу M, заданого в класі A1.
Контроль типів, що виконується на етапі компіляції, називається статичним контролем типів.
Перейдемо до розгляду динамічного зв'язування. І знову розглянемо основну операцію - виклик
x1.M (arg1, arg2,... argN);
Припустимо, що статичний контроль типів для цього виклику успішно виконано. Розглянемо ще один аспект, пов'язаний з цим викликом. Згадаймо, що x1 - це посилання, яке пов'язане з об'єктом, розташованим у динамічній пам'яті. Чи завжди збігається тип об'єкту і тип посилання? Іншими словами, чи завжди об'єкт, створений у динамічній пам'яті, належить класу A1? Відповідь: ні, не завжди.
Метод M є поліморфним, якщо маючи одне і те ж ім'я і сигнатуру, він існує в різних формах - для кожного класу задана власна реалізація методу. Виникає природне запитання, який же метод M слід викликати - метод класу A1 (метод посилання) або метод того класу, якому належить реальний об'єкт у динамічній пам'яті (метод об'єкта). Можливі два рішення цього питання, і обидва варіанти використовуються на практиці.
Визначення. Статичним зв'язуванням називається зв'язування мети виклику і викликаного методу на етапі компіляції, коли з сутністю зв'язується метод класу, заданого при оголошенні сутності - метод посилання.
Визначення. Динамічним зв'язуванням називається зв'язування мети виклику і викликаного методу на етапі виконання, коли з сутністю зв'язується метод класу об'єкта, пов'язаного із класом в момент виконання - метод об'єкта.
При статичному зв'язуванні метод вибирається з класу сутності, при динамічному - з класу об'єкта, пов'язаного із сутністю. Зрозуміло, що на етапі компіляції можливо тільки статичне зв'язування, оскільки тільки в період виконання можна визначити, з об'єктом якого класу пов'язана дана сутність. Це може бути клас будь-якого з нащадків класу сутності. Для того, щоб виконувалося динамічне зв'язування, батьківський клас, що вперше створює метод, повинен забезпечити метод модифікатором virtual або abstract, в класах нащадках такий віртуальний метод буде мати модифікатор override.
Дата добавления: 2015-08-18; просмотров: 100 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Деструктори. | | | Внешние и внутренние силы. |