Cамоучитель по VB.NET

       

Информация о членах класса Windows.Forms.Form




В программировании, как и в современной науке:

  • Клоном называется точная копия объекта.
  • Состояние клона может измениться и стать отличным от состояния исходного объекта.

Но самое важное правило клонирования формулируется так:

  • Изменения в клоне не должны отражаться на исходном объекте, на основе которого клон создавался.

Последнее обстоятельство затрудняет клонирование во всех языках ООП, поэтому ме-тод MemberWiseClone считается потенциально опасным. Дело в том, что объект может содержать другие объекты. Если внутренние объекты не будут клонированы одновременно с объектом, их содержащим, вместо пары оригинал-клон вы получите сиамских близнецов, которые будут зависеть друг от друга. Если класс содержит поля, которые представляют собой изменяемые объекты, метод MemberWiseClone заведомо создает «сырой», неполноценный клон (это называется поверхностным копированием). Метод MemberWiseClone успешно клонирует только те объекты, поля которых относятся исключительно к структурным типам.

Следующий пример наглядно показывает, что имеется в виду под этим предупреждением. Массивы VB .NET в отличие от массивов VB6 являются объектами.

Допустим, мы пытаемся клонировать объект класса, одно из полей которого представляет собой массив:

1 Public Class EmbeddedObjects

2 Private m_Data() As String

3 Public Sub New(ByVa1 anArray() As String)

4 m_Data = anArray

5 End Sub

6 Public Sub OisplayData()

7 Dim temp As String

8 For Each temp In m_Data

9 Console.WriteLine(temp)

10 Next

11 End Sub

12 Public Sub ChangeData(ByVal newData As String)

13 m_Data(0) = newData

14 End Sub

15 Public Function Clone() As EmbeddedObjects

16 Return CType(Me.MemberwiseClone. EmbeddedObjects)

17 End Function

18 End Class

Выполните следующую процедуру Sub Main:

Sub Main()

Dim anArray() As String ={"HELLO"}

Dim a As New EmbeddedObjects(anArray)

Console.WriteLinet"Am going to display the data in object a now!")

a.DisplayData()

Dim b As EmbeddedObjects

b =a.Clone()

Dim newData As String ="GOODBYE"

b.ChangeData(newData)

Console.WriteLine("Am going to display the data in object b now!")

b.DisplayData()

Console.WriteLine("Am going to re-display the data in a" & _

"after making a change to object b!!!") a.DisplayData()

Console. ReadLine() End Sub



Содержание раздела