![]()
Главная Обратная связь Дисциплины:
Архитектура (936) ![]()
|
Абстрактні класи. Запечатані класи
Ключове слово abstract дозволяє створювати класи і члени класів , які є неповними і мають бути реалізовані в похідному класі. Ключове слово sealed дозволяє запобігти спадкування класу або певних членів класу, помічених раніше як virtual . Абстрактні класи та члени класів Класи можуть бути оголошені абстрактними шляхом приміщення ключового слова abstract перед визначенням класу. Наприклад: Public Abstract Class A { // Class members here. } Створювати екземпляри абстрактного класу не можна. Призначення абстрактного класу полягає в наданні загального визначення для базового класу, яке можуть спільно використовувати кілька похідних класів. Наприклад, в бібліотеці класів може бути визначений абстрактний клас, який використовується в якості параметра для багатьох з її функцій, тому програмісти, що використовують цю бібліотеку, повинні задати свою реалізацію цього класу, створивши похідний клас. Абстрактні класи можуть визначати абстрактні методи. Для цього перед типом значення, що повертається методу необхідно помістити ключове слово abstract . Наприклад: Public Abstract Class A { Public Abstract Void DoWork ( Int I); } Абстрактні методи не мають реалізації, тому визначення такого методу закінчується крапкою з комою замість звичайного блоку методу. Класи, похідні від абстрактного класу, повинні реалізовувати всі абстрактні методи. Якщо абстрактний клас успадковує віртуальний метод з базового класу, абстрактний клас може перевизначити віртуальний метод за допомогою абстрактного методу. Якщо метод virtual оголошується як abstract , він все одно вважається віртуальним по відношенню до будь-якого класу, успадковує від абстрактного класу. Клас, що успадковує абстрактний метод, не може звертатися до вихідної реалізації методу - див. Попередній приклад, DoWork в класі F не може викликати DoWork в класі D. Таким чином абстрактний клас може "примушувати" похідні класи надавати нові реалізації для віртуальних методів. Запечатані класи і члени класів Класи можуть бути оголошені як запечатані шляхом приміщення ключового слова sealed перед визначенням класу. Наприклад: Public Sealed Class D { // Class members here. } Запечатаний клас не може використовуватися в якості базового класу. Тому він також не може бути абстрактним класом. Запечатані класи запобігають спадкування. Оскільки їх не можна використовувати в якості базових класів, певна оптимізація під час виконання дозволяє дещо прискорити виклик членів запечатаних класів. Метод, індексатор, властивість або подія для похідного класу, перевизначаються віртуальний член базового класу, може оголошувати цей член як запечатаний. Це робить марним віртуальний аспект члена для кожного наступного похідного класу. Для цього в оголошенні члена класу необхідно перед ключовим словом override помістити ключове слово sealed . Наприклад: Public Class D: C { Public Sealed Override Void DoWork () {} } Види взаємодії між класами. Клас Оbject В C # передбачений спеціальний клас object , який неявно вважається базовим класом для всіх інших класів і типів, включаючи і типи значень. Іншими словами, всі інші типи є похідними від object. Це, зокрема, означає, що змінна посилального типу object може посилатися на об'єкт будь-якого іншого типу. Крім того, змінна типу object може посилатися на будь-який масив, оскільки в C # масиви реалізуються як об'єкти. Формально ім'я object вважається в C # ще одним позначенням класу System.Object, що входить в бібліотеку класів для середовища .NET Framework. Практичне значення цього в тому, що крім методів і властивостей, які ви визначаєте, також з'являється доступ до безлічі загальнодоступних і захищених методів-членів, які визначені в класі Object. Ці методи присутні у всіх визначених класах. Методи System.Object ToString () Метод ToString () повертає символьну рядок, що містить опис того об'єкта, для якого він викликається. Крім того, метод ToString () автоматично викликається при виведенні вмісту об'єкта за допомогою методу WriteLine (). Цей метод перевизначається в багатьох класах, що дозволяє пристосовувати опис до конкретних типів об'єктів, що створюються в цих класах. GetHashCode () Цей метод використовується, коли об'єкт поміщається в структуру даних, відому як карта (map), яка також називається хеш-таблицею або словником. Застосовується класами, які маніпулюють цими структурами, щоб визначити, куди саме в структуру повинен бути поміщений об'єкт. Якщо ви маєте намір використовувати свій клас як ключ словника, то повинні перевизначити GetHashCode (). Існують досить суворі вимоги щодо того, як потрібно реалізовувати перевантаження. Equals () і ReferenceEquals () За замовчуванням метод Equals (object) визначає, посилається Чи викликає об'єкт на той же самий об'єкт, що і об'єкт, що указується в якості аргументу цього методу, тобто він визначає, чи є обидва посилання однаковими. Метод Equals (object) повертає логічне значення true, якщо порівнювані об'єкти однакові, в іншому випадку - логічне значення false. Він може бути також перевизначений в створюваних класах. Це дозволяє з'ясувати, що ж означає рівність об'єктів для створюваного класу. Finalize () Призначення цього методу в C # приблизно відповідає деструктором С ++, і він викликається при збірці сміття для очищення ресурсів, зайнятих посилальним об'єктом. Реалізація Finalize () з Object насправді нічого не робить і ігнорується складальником сміття. Зазвичай перевизначати Finalize () необхідно, якщо об'єкт володіє некерованими ресурсами, які потрібно звільнити за його знищенні. GetType () Цей метод повертає екземпляр класу, успадкований від System.Type. Цей об'єкт може надати великий обсяг інформації про клас, членом якого є ваш об'єкт, включаючи базовий тип, методи, властивості і т.п. System.Type також являє собою стартову точку технології рефлексії .NET. Clone () Цей метод створює копію об'єкта і повертає посилання на цю копію (а в разі типу значення - посилання на упаковку). Відзначимо, що при цьому виконується неглибоке копіювання, тобто копіюються всі типи значень в класі.
![]() |