Vb.net 替代子对象中的对象定义并在父对象中使用它

Vb.net 替代子对象中的对象定义并在父对象中使用它,vb.net,object,parent,Vb.net,Object,Parent,我有一个在父类(CoreEngine)中定义的对象(称为Ticker),我试图在父类的一个子类中使用不同的对象定义(但保留相同的名称以在CoreEngine中使用)来覆盖它。我想我应该使用“阴影”定义,但我似乎要将对象设置为null ticker对象是我希望与父类中定义的方法一起使用的对象,但我希望在定义CoreEngine的子对象以使用不同的ticker对象定义时更改其类型 Public Class CoreEngine Public WithEvents Ticker As Tic

我有一个在父类(CoreEngine)中定义的对象(称为Ticker),我试图在父类的一个子类中使用不同的对象定义(但保留相同的名称以在CoreEngine中使用)来覆盖它。我想我应该使用“阴影”定义,但我似乎要将对象设置为null

ticker对象是我希望与父类中定义的方法一起使用的对象,但我希望在定义CoreEngine的子对象以使用不同的ticker对象定义时更改其类型

Public Class CoreEngine

    Public WithEvents Ticker As TickerClass

    Public Sub New()
    End Sub

    Public Overridable Sub Activate()

        Ticker = New TickerClass()

    End Sub

''call methods that use Ticker

End Class
在儿童班:

Public Class ChildEngineClass
    Inherits CoreEngine

    Public Shadows WithEvents Ticker As BacktestTickerClass ' <<-- this class inherit the TickerClass too

    Public Sub New()
    End Sub

    Public Overrides Sub Activate()

        Ticker = New BacktestTickerClass() 

    End Sub

End Class
Public Class ChildEngineClass
    Inherits CoreEngine

    Public Sub New()
    End Sub

    Public Overrides Sub Activate()

        Ticker = New BacktestTickerClass() 

    End Sub

End Class
公共类ChildEngineClass
继承CoreEngine

Public Shadows with events Ticker As BacktestTickerClass'简而言之,您不能更改type类中字段的类型,并且希望父级知道它。父级不知道有关其子级的任何信息,也不知道您更改了类型

由于
BacktestTickerClass
继承自
TickerClass
,因此您可以不更改
Ticker
的定义,而是重写
Activate
并将其实例化为子类:

Public Class ChildEngineClass
    Inherits CoreEngine

    Public Shadows WithEvents Ticker As BacktestTickerClass ' <<-- this class inherit the TickerClass too

    Public Sub New()
    End Sub

    Public Overrides Sub Activate()

        Ticker = New BacktestTickerClass() 

    End Sub

End Class
Public Class ChildEngineClass
    Inherits CoreEngine

    Public Sub New()
    End Sub

    Public Overrides Sub Activate()

        Ticker = New BacktestTickerClass() 

    End Sub

End Class

显然,这种方法只能使用父类中可用于
TickerClass
的方法。如果您需要使用仅在
BacktestTickerClass
中可用的任何内容,则必须在
ChildEngineClass

中重写父类中的方法,并在tickers上使用继承

Public Class BaseTicker
    '...
End Class

Public Class DerivedTicker1
    Inherits BaseTicker
    '...
End Class

Public Class DerivedTicker2
    Inherits BaseTicker
    '...
End Class
现在,您可以使用基本ticker定义ticker并将其指定为派生ticker

Public Class CoreEngine
    Public WithEvents Ticker As BaseTicker

    Public Sub New()
        Ticker  = New DerivedTicker1() 'Or possibly New BaseTicker()
    End Sub

    '...
End Class

Public Class ChildEngineClass
    Inherits CoreEngine

    'Do not redefine Ticker here.
    'Ticker is automatically inherited from the base class.

    Public Sub New()
        Ticker  = New DerivedTicker2()
    End Sub
End Class

我已经编辑了你的标题。请看“”,其中的共识是“不,他们不应该”。谢谢。BacktestTickerClass超越了TickerClass的一些方法,这仍然有效吗?另外,如果Ticker最初被引用到TickerClass,那么当它被引用时,我如何替换定义呢?这是因为BacktestTickerCLass是它的子类吗?是的,您可以将变量声明为父类并实例化为子类。但是如果没有强制转换,则只有父类的方法可用。