2016-09-12 11 views
0

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

Проблема: Я разработал класс clsParameter, который имеет одно имя, один элемент, один тип значения и одно значение. Значение может быть двойным или объектом типа clsVectorParameter со свойствами X, Y, Z. Теперь я хочу сделать глубокую копию параметра так, чтобы X, Y, Z также были скопированы.

Вот два класса. Функция клонирования ниже просто представляет собой манекен. Я знаю, что это не работает, как это, но я не знаю, лучший способ ...

Public Class clsParameter 
' Using the ICloneable interface 
Implements ICloneable 

' Variable definition 
Private m_Name As String 
Private m_Unit As String 
Private m_Type As String 
Private m_Value As Object 

' Define set and get methods 
Public Property Name As String 
    Get 
     Return m_Name 
    End Get 
    Set(ByVal value As String) 
     m_Name = value 
    End Set 
End Property 

Public Property Unit As String 
    Get 
     Return m_Unit 
    End Get 
    Set(ByVal value As String) 
     m_Unit = value 
    End Set 
End Property 


Public Property Value As Object 
    Get 
     Return m_Value 
    End Get 
    Set(ByVal value As Object) 
     m_Value = value 
    End Set 
End Property 

Public Property Type As String 
    Get 
     Return m_Type 
    End Get 
    Set(ByVal value As String) 
     m_Type = value 
    End Set 
End Property 

' Define constructor 
Public Sub New(ByVal p_Name As String, ByVal p_Unit As String, ByVal p_Value As Object, ByVal p_Type As String) 
    m_Name = p_Name 
    m_Unit = p_Unit 
    m_Type = p_Type 
    m_Value = p_Value 
End Sub 

' Define Clone function to create independent copies of parameter instances 
Public Function Clone() As Object Implements System.ICloneable.Clone 
    Dim cloneParam As New clsParameter(m_Name, m_Unit, m_Value, m_Type) 
    Return cloneParam 
End Function 
End Class 

и другой класс:

Public Class clsVectorParameter 

Implements ICloneable 


' Variable definition 
Private m_x As Double 
Private m_y As Double 
Private m_z As Double 

Public Property X As Double 
    Get 
     Return m_x 
    End Get 
    Set(ByVal value As Double) 
     m_x = value 
    End Set 
End Property 


Public Property Y As Double 
    Get 
     Return m_y 
    End Get 
    Set(ByVal value As Double) 
     m_y = value 
    End Set 
End Property 


Public Property Z As Double 
    Get 
     Return m_z 
    End Get 
    Set(ByVal value As Double) 
     m_z = value 
    End Set 
End Property 

' Define constructor 
Public Sub New(ByVal p_x As Double, ByVal p_y As Double, ByVal p_z As Double) 
    m_x = p_x 
    m_y = p_y 
    m_z = p_z 
End Sub 

' Define Clone function to create independent copies 
Public Function Clone() As Object Implements System.ICloneable.Clone 
    Dim cloneVecParam As New clsParameter(m_x, m_y, m_z, "Vec") 
    Return cloneVecParam 
End Function 
End Class 

Я использую класс в этой строке:

Dim aNewParam As New clsParameter("Name", "Unit", New clsVectorParameter(x,y,z), "Type") 

или

Dim aNewParam As New clsParameter("Name", "Unit", Double, "Type") 

Позже мне нужно создайте глубокую копию этого aNewParam, поэтому значения x, y, z также независимы для всех параметров.

Большое вам спасибо за помощь! С наилучшими пожеланиями, Себастьян

+0

я бы не использовать 'Clone', так как не ясно, является ли' Clone' делает глубокую или мелкую копию. MS также советует не использовать его. Вот почему это [устарело] (https://blogs.msdn.microsoft.com/brada/2004/05/03/should-we-obsolete-icloneable-the-slar-on-system-icloneable/). Создайте метод 'Copy' /' DeepCopy'. Кроме того, неясно, какая проблема у вас на самом деле. –

+0

Поместите 'Option Strict On' в начало файла исходного кода, чтобы компилятор сообщил вам об ошибке. –

+0

Хорошо, скажем, я использую метод глубокой копии. Может кто-нибудь может объяснить мне, как я реализую его в своем конкретном коде. Я видел много примеров, но адаптация к моей проблеме все время не срабатывает. –

ответ

0

Чтобы сохранить свой код в соответствии с, например, создавая клон с XElement, это сделать из конструктора:

Dim obj1 = new clsVectorParameter(1, 1, 1) 
Dim obj2 = new clsVectorParameter(obj1) 

Так что теперь вам нужно только написать перегруженный конструктор, и нет необходимости в интерфейсах или отдельных функциях.

Перегруженный конструктор может быть сделано, как это: (вы должны адаптировать это к вашему собственному классу):

Public Class Foo 
Dim x As Integer 
Dim y As Integer 
Dim z As Integer 

Sub New(a As Integer, b As Integer, c As Integer) 
    x = a 
    y = b 
    z = c 
End Sub 

Sub New(old As Foo) 
    x = old.x 
    y = old.y 
    z = old.z 
End Sub 
End Class 
+0

Спасибо за ваш ответ. Я попытался написать перегруженный конструктор, но внутри функции клонирования появилось сообщение об ошибке: «Ошибка перегрузки не удалась из-за отсутствия доступного« нового »без сужения преобразования» Но как это может помочь мне с моей проблемой? –

+0

@Seb_Ing Добавлен пример моего ответа. – DrDonut

0
Public Sub New(ByVal p_Name As String, ByVal p_Unit As String, ByVal p_Value As Object, ByVal p_Type As String) 
    m_Name = p_Name 
    m_Unit = p_Unit 
    m_Type = p_Type 
    If TypeOf (p_Value) Is Double Then 
    m_Value = p_Value 
    ElseIf TypeOf (p_Value) Is clsVectorParameter Then 
    m_Value = p_Value.Clone() 
    End If 
End Sub 
+0

К сожалению, это не работает в моем коде ... –

Смежные вопросы