2013-12-21 46 views
1

我有一個對象(稱爲北京時間)是在父類(CoreEngine),我正努力爲忽略與不同的對象定義中定義(但保留在CoreEngine中使用相同的名稱)在父類的子項之一中。我想我應該使用'陰影'的定義,但我似乎將對象設置爲null。覆蓋對象的定義,並用它在父

Ticker對象是我想用於父類中定義的方法的對象,但是我想在定義CoreEngine的子項以使用不同的對象定義時更改其類型。

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 

重寫activate()方法似乎工作,但是當「北京時間」,然後在父對象的方法引用它有一個空引用。所以我的問題是我做錯了什麼?我怎麼能重寫定義在父引用不同的對象(這也是Ticker類的孩子),並仍然能夠在父對象CoreEngine中使用它的定義對象?

+0

我編輯了自己的冠軍。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

2

總之,你不能改變類型字段的類型,並期望父類知道它。家長不瞭解兒童的任何信息,也不知道你是否改變了類型。

由於BacktestTickerClassTickerClass繼承,你可以做什麼是沒有改變的Ticker的定義,但仍覆蓋Activate並創建實例作爲子類:

Public Class ChildEngineClass 
    Inherits CoreEngine 

    Public Sub New() 
    End Sub 

    Public Overrides Sub Activate() 

     Ticker = New BacktestTickerClass() 

    End Sub 

End Class 

顯然,這樣一來,你只能使用方法是在您的父母課程中提供給TickerClass。如果您需要使用僅在BacktestTickerClass中可用的任何內容,則必須覆蓋ChildEngineClass中的父級方法。

+0

謝謝。 BacktestTickerClass覆蓋了TickerClass的某些方法,它仍然有效嗎?另外,如果Ticker最初引用了TickerClass,那麼我怎樣才能在被定義的時候替換它,是因爲BacktestTickerCLass是它的一個孩子嗎? – rex

+0

是的,你可以聲明該變量爲父類並實例化爲子類。但是如果沒有投射,只有父類的方法可用。 – Szymon

1

的行情

Public Class BaseTicker 
    '... 
End Class 

Public Class DerivedTicker1 
    Inherits BaseTicker 
    '... 
End Class 

Public Class DerivedTicker2 
    Inherits BaseTicker 
    '... 
End Class 

使用繼承現在你可以使用基礎股票定義股票併爲其指定導出行情

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