2017-09-29 266 views
0

我想创建一个基类,可以继承和用于雏菊链调用,但我需要返回的对象是派生类。从基类返回派生类实例

考虑:

Public Class MyElement 
    Public Function SetAttribute(name As String, value As String) As MyElement 
     // Set the attribute 
     Return Me 
    End Function 
End Class 

Public Class ExtendedElement 
    Inherits MyElement 

    Public Sub DoSomething() 
     // Code to do something 
    End Sub 
End Class 

// What I would like to achieve 

Dim my_var As New ExtendedElement 
my_var. 
    SetAttribute("FirstName", "Bob"). 
    SetAttribute("LastName", "Builder"). 
    DoSomething() 

是这种事情可能吗?

+0

你想要什么是不可能的。除非使其通用,否则“SetAttribute”方法的类型固定为基类。该对象仍然是派生类,因此您可以将返回值作为派生类型进行强制转换,但必须在调用的某处指定派生类型,即泛型类型参数或强制类型。 – jmcilhinney

+0

另一种方法是在基类中声明'DoSomething'方法,或者是MustOverride或者默认实现,然后在每个派生类中重写它。当然,除非'DoSomething'在逻辑上应该是每个派生类的成员,否则这是不可行的。 – jmcilhinney

回答

2

您有几种选择,不是直线前进。

铸造

,就可以把返回的值。

Dim my_var As New ExtendedElement 
    CType(my_var. 
     SetAttribute("FirstName", "Bob"). 
     SetAttribute("LastName", "Builder"), ExtendedElement). 
     DoSomething() 

重写

您可以在子类中添加DoSomething的,把功能父。

Public Class MyElement 
    Public Function SetAttribute(name As String, value As String) As MyElement 
     Return Me 
    End Function 

    Public Overridable Sub DoSomething() 
    End Sub 

End Class 

Public Class ExtendedElement 
    Inherits MyElement 

    Public Overrides Sub DoSomething() 
     ' Do logic here 
    End Sub 

End Class 

    my_var. 
     SetAttribute("FirstName", "Bob"). 
     SetAttribute("LastName", "Builder"). 
     DoSomething() 

泛型

让父类泛型类返回适当的子类。

Public Class MyElement(Of T As MyElement(Of T)) 
    Public Function SetAttribute(name As String, value As String) As T 
     Return Me 
    End Function 
End Class 

Public Class ExtendedElement 
    Inherits MyElement(Of ExtendedElement) 

    Public Sub DoSomething() 
     ' Do logic here 
    End Sub 

End Class 

    Dim my_var As New ExtendedElement 
    my_var. 
     SetAttribute("FirstName", "Bob"). 
     SetAttribute("LastName", "Builder"). 
     DoSomething() 
+0

你是否在做“公共班级MyElement(T为MyElement(Of T)) ”还是“Public Class MyElement(Of T)”? –

0

你可以做这样的事情:

Dim MyVar as new ExtendedElement 
Ctype(MyVar.SetAttribute("FirstName", "Bob"). _ 
     SetAttribute("LastName", "Builder"), ExtendedElement).DoSomething()