С# для AS3 розробників

Минулого разу ми з вами розглянули абстрактні класи, але вже цього тижня ми обговоримо навіть абстрактніший тип класів (ніж абстрактні класи): статичні класи. Також ми розглянемо анти-конструктори C#, які більш відомі, як «деструктори», і, на додаток до всього, ми розглянемо деякі кумедні трюки під час роботи з конструкторами класів.
Давайте почнемо сьогоднішню статтю з «навіть абстрактніших» класів: статичних класів. Працюючи з абстрактними класами, ви все ще можете розширювати їх та створювати екземпляри дочірніх класів:
Працюючи зі статичними класами, ви не можете ні інстанціювати, ні успадковувати їх. Ви ніколи не зможете створити екземпляр такого класу:
Але навіщо взагалі можуть знадобитися подібні класи? Подібні класи можуть бути гарним місцем для зберігання статичних функцій, полів та властивостей. І оскільки ви не можете створювати екземпляри подібних класів, у них заборонено використання не статичних полів будь-яких типів даних. Конструктори екземплярів класу як і заборонені, т.к. клас автоматично дорівнює sealed класів. Досить популярний приклад використання таких класів — клас Math. Вам навряд чи коли-небудь потрібно буде створити екземпляр цього класу, але в ньому міститься велика кількість корисних статичних функцій (наприклад Abs) і полів (наприклад PI). Ось, як може виглядати реалізація такого класу:
У AS3 за замовчуванням немає підтримки статичних класів на етапі компіляції, але ви можете обійти це обмеження, використовуючи перевірки на етапі відтворення (run-time). Все, що вам потрібно буде зробити, це оголосити клас, як final, і завждикидати помилку в конструкторі цього класу:
Наступним пунктом у сьогоднішній програмі йдуть деструктори, які є «анти-конструкторами», тому що вони відповідають за знищення класу, а не за його створення, як у випадку зі звичайними конструкторами. Деструктори викликаються збирачами сміття (Garbage Collector) безпосередньо перед тим, як об'єкт звільняє пам'ять, яку він займає. Ось, як вони виглядають:
Для створення деструктора достатньо додати
до імені класу. Деструктор може лише один, і з ним не можна використовувати модифікатори доступу. Зазвичай, необхідності в створенні деструкторів немає, але в деяких випадках вони можуть бути корисними як спосіб очищення ресурсів після використання класу. У прикладі нижче деструктор використовується видалення з операційної системи тимчасового файлу, який інакше буде видалено, т.к. GC ніколи не зробить цього:
У цьому прикладі клас TemporaryFile створює файл у конструкторі екземпляра класу, і видаляє файл, коли на екземпляр класу немає посилань і клас готовий бути зібраним GC, щоб звільнити пам'ять. У AS3 немає функцій, які викликалися, коли екземпляр класу готовий бути зібраним GC. Зазвичай, щоб реалізувати подібну поведінку, необхідно вручну створювати та викликати «псевдо-деструктори» (зазвичай їх називають dispose чи destroy):
Трюки при роботі з конструкторами
Останньою темою на сьогодні будуть трюки під час роботи з конструкторами. Ми вже розбирали спосіб виклику конструктора базового класу, використовуючи ключове слово base (аналогічно використанню ключового слова super в AS3):
Також ми розглядали можливість створення більш ніж одного конструктора, використовуючи «перевантаження»:
Зазвичай цей спосіб призводить до дублювання коду всерединіконструкторів. Проте, т.к. версія конструктора, яка приймає 3 параметри найбільш загальна з усіх, можна просто викликати її з 2 інших конструкторів:
Ми можемо використовувати this() для виклику інших конструкторів у межах нашого класу (за аналогією з base(), що дозволяло викликати конструктор батьківського класу). І знову, в AS3 не було подібного функціоналу за замовчуванням, тому його доводилося «емулювати» за допомогою статичних псевдо-конструкторів, які викликали функції на зразок init/setup/contruct у об'єктів, що створюються:
На цьому ми сьогодні закінчимо і, як завжди, наприкінці статті ми порівняємо описані сьогодні особливості роботи з C# і AS3: