【解決したい問題】
PersonClassからEmployeeClassへのダウンキャストの実装を、
できるだけ簡潔に記述したいと考えております。
ダウンキャスト後にemployee.Nameとemployee.Ageに
person.Nameとperson.Ageの値が入っている必要があります。
以下のコードは
employee = DirectCast(person, EmployeeClass)
の場所でSystem.InvalidCastExceptionが発生します。
Sub Main()
Dim person As New PersonClass
person.Name = "山田太郎"
person.Age = 22
Dim employee As New EmployeeClass
employee = DirectCast(person, EmployeeClass)
employee.EmployeeCode = "1234"
End Sub
Private Class PersonClass
Property Name As String
Property Age As Integer
End Class
Private Class EmployeeClass
Inherits PersonClass
Property EmployeeCode As String
End Class
【解決するために何をしたか】
以下のようにコードを修正したところ、エラーは発生しなくなりました。
しかしこの場合は、PersonClassのコンストラクタで
全てのメンバーを設定しなくてはいけません。
もっと簡潔に記述できる方法はないでしょうか?
Sub Main()
Dim person As New PersonClass
person.Name = "山田太郎"
person.Age = 22
'Dim employee As New EmployeeClass
'employee = DirectCast(person, EmployeeClass)
'employee.EmployeeCode = "1234"
Dim employee As New EmployeeClass(person)
employee.EmployeeCode = "1234"
End Sub
Private Class PersonClass
Property Name As String
Property Age As Integer
Sub New()
End Sub
Sub New(person As PersonClass)
Me.Name = person.Name
Me.Age = person.Age
End Sub
End Class
Private Class EmployeeClass
Inherits PersonClass
Property EmployeeCode As String
Sub New(person As PersonClass)
MyBase.New(person)
End Sub
End Class
2016/11/12(Sat) 00:30:34 編集(投稿者)
継承の関係が必須ではないのであれば、委譲・保有の関係を考えた方がよいかもしれません。
Public Class EmployeeClass
Property Person As PersonClass
Property EmployeeCode As String
Sub New(person As PersonClass)
Me.Person = person
End Sub
End Class
継承の関係が必要であり、メンバー変数が増えていくことに対する手間が大きいなら、
内部構造体を持っておくのも良いかと思います。
ただし、この場合、内部構造体に対するアクセサを書いているのでどっちが楽なのか?という点では微妙かもしれません。
Public Structure PersonInfo
Public Name As String
Public Age As Integer
End Structure
Public Class PersonClass
Protected _Info As PersonInfo
Property Name As String
Get
Return _Info.Name
End Get
Set(value As String)
_Info.Name = value
End Set
End Property
Property Age As Integer
Get
Return _Info.Age
End Get
Set(value As Integer)
_Info.Age = value
End Set
End Property
Protected Sub CopyFrom(person As PersonClass)
_Info = person._Info
End Sub
End Class
Public Class EmployeeClass
Inherits PersonClass
Property EmployeeCode As String
Sub New(person As PersonClass)
CopyFrom(person)
End Sub
End Class
※どちらのケースも、ディープコピーとシャローコピーについて学んでおいた方が良いです。