2012-03-30 35 views
1

我有結構化這樣的類:性質調節

Public MustInherit Class A 
    ' several properties 
End Class 

Public Class B 
    Inherits A 
    ' several properties 
End Class 

Public MustInherit Class C 
    Protected _X As A 
    Public ReadOnly Property X As A 
    Get 
     Return _X 
    End Get 
    End Property 
End Class 

Public Class D 
    Inherits C 
    Private _X As B 
    Public ReadOnly Property X As B 
    Get 
     Return _X 
    End Get 
    End Property 
    Sub New 
    _X = New B 
    End Sub 
End Class 

是否有修改,我可以在d類屬性X使用,這將導致X從得自d的實例和返回爲B評估爲C的D的實例?

Dim d As New D 
Response.Write((d.X Is Nothing) & "<br>") 
Dim c As C = d 
Response.Write(c.X Is Nothing) 

在這兩種情況下,我要X到不能爲Nothing

我知道我可以修改d如下:

Public Class D 
    Inherits C 
    Private __X As B 
    Public ReadOnly Property X As B 
    Get 
     Return __X 
    End Get 
    End Property 
    Sub New 
    __X = New B 
    _X = __X 
    End Sub 
End Class 

是否有一個清晰的解決方案?

+0

我還沒有嘗試過我自己,但我相信,如果你確實編譯這段代碼,你會被告知到指定'Shadows'或者你需要改變'C'的'X'爲'可覆蓋'。我沒有檢查,但我_think_「陰影」會做你想做的。 – 2012-03-30 01:18:43

+0

你對編譯器是正確的 - 它說使用'Overloads',但它也很滿意'Shadows'。不幸的是,沒有人解決這個問題。 – ic3b3rg 2012-03-30 01:37:59

回答

0

你應該使用Shadows避免新的代碼,但如果你真的需要這個結構,我明白你只用添加MyBase._X=_XD的預期結果New選項1),它也可以做通過D調用C中的New,然後進行相反的賦值_X = DirectCast(MyBase._X, B)選項2)。

當然另一種選擇,這取決於你的實際意圖,是砸在Private _X As BD投只是在_XB在你的陰影X。 (選項3

這是我的代碼與選項1和2註釋和當前執行選項3

Public MustInherit Class C 
    Protected _X As A 
    ''Option 2: 
    'Protected Sub New(X As A) 
    ' _X = X 
    'End Sub 
    Public Overridable ReadOnly Property X As A 
     Get 
      Return _X 
     End Get 
    End Property 
End Class 

Public Class D 
    Inherits C 
    'Commented out for option 3: 
    'Private Shadows _X As B 
    Public Shadows ReadOnly Property X As B 
     Get 
      'Commented out for option 3: 
      'Return _X 
      Return DirectCast(_X, B) 
     End Get 
    End Property 
    Sub New() 
     ''Option 1,3: (Comment out for option 2) 
     _X = New B 
     ''Option 1: 
     'MyBase._X = _X 
     ''Option 2: 
     'MyBase.New(New B) 
     '_X = DirectCast(MyBase._X, B) 
    End Sub 
End Class 
+0

我沒有測試所有的選項,但我認爲只有選項2將工作。基本上,如果我將B存儲爲A,然後將其重新寫入B,那麼在這個過程中我將失去任何B屬性。選項2比我想出的更清潔 - 謝謝! – ic3b3rg 2012-03-30 05:52:40

+0

@ ic3b3rg你說:「如果我將'B'存儲爲'A',然後將其重寫爲'B',那麼在這個過程中我將失去任何'B'屬性:」這只是一個強制轉換,對象是仍然是一個'B';其屬性仍然存在。它只是Shadows的一個特性(當有可用時可以用Overrides),以及你主要問題的要求是什麼,它允許你通過'A'類到'B'對象的變化。 – 2012-03-30 06:07:18