|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Статичний контроль типів і динамічне зв'язування
Розглянемо сімейство класів 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. Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.) |