วันอังคารที่ ๑๕ กันยายน พ.ศ. ๒๕๕๒

VB.NET ICloneable

วันนี้ (15 ก.ย. 2552) ได้เข้าไปอ่านกระทู้ที่ GreatFriends เจอคำถามหนึ่งน่าสนใจครับ

การให้ค่ากับ object
http://greatfriends.biz/?113627

คำถามมีดังนี้ครับ
ผมสร้าง class Node กับ Variable

ซึ่ง class Node ก็ประกอบไปด้วยตัวแปรต่าง
และก็มี Variable
ส่วน class Variable ก็ประกอบไปด้วยตัวแปรต่าง

เมื่อผมต้องการกำหนดค่าให้กับ Node ก็สร้าง Node node = new Node;
Variable variable = new Variable;
variable. = .....;ก็กำหนดค่าให้

แล้วก็ node.Variable = variable;

ที่นี้พอผมเปลี่ยนค่า ใน
variable variable. = .....;

ที่นี้node.Variable ก็เลยเปลียนตามไปด้วย
แต่ผมไม่ต้องการให้เปลี่ยน
ผมเลยอยากทราบว่าต้องเซตค่าnode.Variable =
variableยังไงถึงค่าในnode.Variable กับ variable
แยกออกจากกันไม่สัมพันธ์กันอ่ะครับ


ลักษณะนี้ก็คือ เราต้องการให้ Variable Object ที่ถูกกำหนดค่าให้ Node Object เป็นคนละตัวกับ Variable Object ที่เราสร้างไว้แต่แรก ผมเลยเสนอให้ใช้ ICloneable Interface ครับ ก็เลยคิดว่าน่าจะลองเขียนทดสอบเล่นๆดู มาลองดูโค้ดกันครับ

ส่วนของ Variable Class ที่เราทำการ Implement ICloneable ครับ

Public Class Variable
Implements ICloneable

Private _variableName As String
Private _value As String

Public Property Value() As String
Get
Return _value
End Get
Set(ByVal value As String)
_value = value
End Set
End Property

Public Property VariableName() As String
Get
Return _variableName
End Get
Set(ByVal value As String)
_variableName = value
End Set
End Property

Public Function Clone() As Object Implements System.ICloneable.Clone
Return TryCast(MemberwiseClone(), Variable)
End Function

End Class


ส่วนของ Node Class

Public Class Node

Private _nodeId As Integer
Private _nodeName As String
Private _variable1 As Variable
Private _variable2 As Variable

Public Property Variable2() As Variable
Get
Return _variable2
End Get
Set(ByVal value As Variable)
_variable2 = value
End Set
End Property

Public Property Variable1() As Variable
Get
Return _variable1
End Get
Set(ByVal value As Variable)
_variable1 = value
End Set
End Property

Public Property NodeName() As String
Get
Return _nodeName
End Get
Set(ByVal value As String)
_nodeName = value
End Set
End Property

Public Property NodeId() As Integer
Get
Return _nodeId
End Get
Set(ByVal value As Integer)
_nodeId = value
End Set
End Property

End Class


และทีนี้ก็มาทดสอบกัน

Dim myNode As New Node
Dim myVar1 As New Variable
Dim myVar2 As New Variable

myNode.NodeId = 1
myNode.NodeName = "Test"
myVar1.VariableName = "EmployeeName"
myVar1.Value = "Nithi"

myVar2.Value = "EmployeeSurname"
myVar2.Value = "Juabsamai"

myNode.Variable1 = myVar1.Clone
myNode.Variable2 = myVar2

Debug.Print("{0} - {1} {2}", myNode.NodeName, myNode.Variable1.Value, myNode.Variable2.Value)

myVar1.Value = "Wanwimon"
myVar2.Value = "Permpanit"

Debug.Print("{0} - {1} {2}", myNode.NodeName, myNode.Variable1.Value, myNode.Variable2.Value)

myNode.Variable1.Value = "Nithi"
myNode.Variable2.Value = "Juabsamai"
Debug.Print("{0} - {1} {2}", myNode.NodeName, myNode.Variable1.Value, myNode.Variable2.Value)
Debug.Print("Variable2 = " & myVar2.Value)


ที่น่าสนใจคือ .NET ได้เตรียม MemberwiseClone Function มาให้เราเรียบร้อยแล้ว ไม่ต้องเขียนเอง สะดวกดีครับ หลังจากทดสอบดูแล้ว คิดว่าน่าจะตรงกับที่เจ้าของกระทู้ที่ GreatFriends ต้องการนะครับ

ไม่มีความคิดเห็น: