Финализиране, Приключване
и колекция Garbage
Във VB .NET, събитието Terminate
не съществува. Тук, за да разберем как става приключването и унищожаването,
трябва да разгледаме колекция - garbage collection.
Когато колекторът за боклук (garbage collector) открие,че обектът вече не се ползва (примерно изпълняващата се
програма не поддържа повече връзка с обекта), той автоматично стартира
специален деструктивен метод (destructor method) наречен Finalize. Ние нямаме способ да определим кога garbage collector ще извика метод Finalize.
Ние трябва да бъдем сигурни, че известно време след като не
е осъществена връзка с обекта, той ще се финализира. Всяко закъснение
означава,че.NET Framework ще използва така наречената колекция reference-tracing garbage collection, която периодично освобождава
нереализираните ресурси. Finalize е защитен метод (Protected method). Може
да бъде извикан от клас или произхождащ клас, но не и извън класа,
включително и от клиента на класа. (Всъщност, понеже деструктора Finalize автоматично се извиква от боклукджийския колектор {garbage collector}, класът никога не би трябвало да
вика собствения си метод Finalize директно.) Ето генералния синтаксис и формат
на метод Finalize:
Overrides Protected Sub
Finalize( )
' код за изчистване
MyBase.Finalize
End Sub
Ползата от колекцията garbage е, че прочиства ресурси без
вмешателство на програмиста. Това си има и недостатъци. Не можем да унищожаваме обекти,
точно в момента, когато нямаме нужда от тях. Трябва да отбележим, че не всички
ресурси се управляват от общата езикова среда - Common Language Runtime. Windows обработките и връзките с бази
данни не са субекти на колекцията garbage.
За да даде възможност за ръчно унищожаване на ресурси, библиотека Base Class Library дефинира втори деструктор,
наречен Dispose. Синтаксисът и употребата му са
илюстрирани в кода:
Class classname
Implements IDisposable
Public Sub Dispose( )
Implements IDisposable.Dispose
' код за изчистване
' ако е нужно викане на дъщерни обекти - Dispose
methods
End Sub
' друг код за класа
End Class
Отбележете, че класовете, които поддържат този деструктор
(който може да се вика) трябва да изпълняват IDisposable
интерфейс-- оттук
оператор Implements. IDisposable има само един член, методът Dispose. Необходимо е да се информира всеки клиент на класа, че
трябва да вика този метод специфичен за реализиране на ресурси.
Можем да формулираме методи и свойства наследяващи от Garbage Collection namespace които
да имат контрол над обектите на разпореждане. Пример за такъв код:
Imports System
' Dispose class.
Public Class DisposeMe
Inherits Object
Public Sub Dispose(objName
as String)
'objName ще се получи от предишното използвайки
'ToString Public Instance Method и съхранявайки
стойността в стринга.
Finalize
GC.SuppressFinalize(objName)
End Sub
Protected Overrides Sub
Finalize()
'не е нужен clean-up code; Finalize ще стартира
End Sub
End Class
С този пример може успешно да контролирате ръчното
приключване на обекти и ресурси..com
Абстрактният клас (abstract class) може да бъде дефиниран като клас скелет (skeleton) в който няма код--само декларации за използване от произхождащите
класове, чиято структура ще съдържа този скелет. С други думи костите и мускулите ще се добавят
по-късно.
Примерно нека имаме абстрактния клас elrctro_uchitel:
Abstract class electro_uchitel
Private Electrotechnika_prepodava
As Integer
Electrotechnika_prepodava =
1
Public Property prepodava
() As Integer
Get
Return Electrotechnika_prepodava
End Get
End Property
End Class
Public class Silnotokov_uchitel
Inherits electro_uchitel
Public Property moge_da_prepodava()
as String
If prepodava = 1 Then
'тук е кода,който дава сведение, че силнотоков
специалист може да преподава Електротехника!
End If
End Property
End Class
Използвайки абстрактния клас electro_uchitel, ние поставяме
изискването класа Silnotokov_uchitel да каже Silnotokov_uchitel може ли
да преподава
Електротехника. Това може после да се използва и за друг клас,
Slabotokov_uchitel, който може да използва Electrotechnika_prepodava за
организация на разпределението на часовете в дадено
професионално училище.