2012-03-30 6 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 

Есть ли модификатор можно использовать на имущество X в классе D, который заставит X должен быть возвращен в качестве B из экземпляра D и А из экземпляр D, который оценивается как C?

т.е.

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

В обоих случаях я хочу X не не быть ничего

Я понимаю, что я мог бы изменить 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' или вам нужно изменить' 'x' C' на' Overridable '. Я не проверял, но я хочу, чтобы тень делала то, что ты хочешь. –

+0

Вы правы в отношении компилятора - он говорит, что использует «Overloads», но он также доволен «Shadows». К сожалению, никто не решает проблему. – ic3b3rg

ответ

0

Вы должны избегать нового кода с помощью Shadows, но если вам действительно нужна эта конструкция, я получаю результаты вы ожидаете только с добавлением MyBase._X=_X к D «s New (Вариант 1), который также может быть сделано используя New в C, что D вызывает, то делает противоположное назначение _X = DirectCast(MyBase._X, B) (Вариант 2).

Конечно еще один вариант, в зависимости от вашего фактического намерения, это отбросить Private _X As B в D и просто бросить _X к B в вашей тени 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

+0

@ ic3b3rg Вы говорите: «Если я храню« B »как' A', а затем переделаю его в «B», я потеряю любые свойства «B» в процессе »: это всего лишь литье, объект все еще действительно 'B'; его свойства все еще существуют. Это просто функция «Тени» (и «Переопределения», когда они доступны), и что задавал ваш основной вопрос, что позволяет варьировать то, что вы видите через класс «A», к объекту «B». –

Смежные вопросы