Выбор между интерфейсами и наследованием. Важнейшие интерфейсы: ICloneable и IDisposable.
В классах, содержащих внутренние объекты, реализация метода Clone потребует значительно больших усилий (хотя в главе 9 описан прием, позволяющий достаточно просто решить эту задачу в большинстве случаев). Так, в приведенном выше классе EmbeddedObject необходимо клонировать внутренний массив, не ограничиваясь простым копированием.
Как это сделать? Очень просто. Поскольку класс Array реализует интерфейс ICloneable, он должен содержать метод для клонирования массивов. Остается лишь вызвать этот метод в нужном месте. Ниже приведена версия класса Ет-beddedObjects с реализацией ICloneable:
Public Class EmbeddedObjects Implements ICloneable Private m_Ma() As String Public Sub New(ByVal anArray() As String) m_Data = anArray End Sub Public Function Clone() As Object Implements ICloneable.Clone Dim temp()As String temp = m_Data.Clone ' Клонировать массив Return New EmbeddedObjects(temp) End Function Public Sub DisplayData() Dim temp As String For Each temp In m_Data Console.WriteLine(temp) Next End Sub Public Sub ChangeDataCByVal newData As String) m_Data(0) = newData End Sub End Class
Примечание
Список классов .NET Framework, реализующих интерфейс ICloneable (а следовательно, поддерживающих метод Clone), приведен в описании интерфейса ICloneable в электронной документации.
IDisposable
Выше уже упоминалось о том, что метод Finalize не обеспечивает надежного освобождения ресурсов, не находящихся под управлением сборщика мусора. В программировании .NET у этой задачи существует общепринятое решение – класс реализует интерфейс IDisposable с единственным методом Dispose, освобождающим занятые ресурсы:
Public Interface IDisposable Sub Dispose() End Interface
Итак, запомните следующее правило:
Если ваш класс использует другой класс, реализующий IDisposable, то в конце работы с ним необходимо вызвать метод Dispose.
Как будет показано в главе 8, метод Dispose должен вызываться в каждом графическом приложении, зависящем от базового класса Component, поскольку это необходимо для освобождения графических контекстов, используемых всеми компонентами.
Примечание
Список классов .NET Framework, реализующих интерфейс IDisposabe (следовательно, поддерживающих метод Dispose, который должен вызываться в приложениях), приведен в описании интерфейса IDisposable в электронной документации.