2016-08-20 4 views
0

Я хочу, чтобы свойство класса изменялось, когда подкласс реализован (т. Е. Свойство зависит от того, к какому классу он принадлежит).Установить или переопределить свойство readonly базового слоя

В настоящее время у меня есть:

Public MustInherit Class MyBaseClass 

    Public ReadOnly name As String 

    ... 

    Sub New() 
      name = "None" 
    End Sub 
End Class 

Public Class MyClassV0_0 : Inherits MyBaseClass 

    Public Shadows ReadOnly name As String 

    ... 

    Sub New() 
      name = "MyClass v0.0" 
    End Sub 
End Class 

я получаю эти результаты, когда это называется в моей основной код:

Dim classInstance As MyBaseClass = New MyClassV0_0 

Debug.Print(classInstance.name) 

Debug принты: None

Однако я ожидал MyClass v0.0 для печати. Есть ли способ сделать это?

Отметьте, что мне нужно classInstance быть MyBaseClass - если бы я заявлял, что это MyClassV0_0, эта проблема не возникла бы для меня.

ответ

1

Shadows позволяет некоторому член, чтобы определить снова производные, когда база не позволяет ему быть перекрытым (и используется только тогда, когда экземпляр используются в качестве производного типа)

Что вам нужно здесь чтобы сделать базовый элемент Overridable (или MustOverride здесь в качестве базового класса MustInherit и это не кажется, что базовый класс нуждается в реализации по умолчанию) и Overrides его в производном

для того, имя должно быть свойством вместо от поля

Public MustInherit Class MyBaseClass 
    Public MustOverride ReadOnly Property Name As String 
End Class 

Public Class MyClassV0_0 : Inherits MyBaseClass 
    Public Overrides ReadOnly Property Name As String = "MyClass v0.0" 
End Class 

Если имя, если же для всех экземпляров класса, может быть, это должно быть Shared поле, но это также означает, что вы будете получить доступ к нему из класса не из экземпляра

MyBaseClass.Name 
MyClassV0_0.Name 

Что вы можете сделать до сих пор есть поле, это есть приватный конструктор и вызвать этот конструктор из производного класса со значением то поставляется, как это:

Public MustInherit Class MyBaseClass 
    Public ReadOnly Name As String 

    Protected Sub New(name As String) 
     Me.Name = name 
    End Sub 
End Class 

Public Class MyClassV0_0 : Inherits MyBaseClass 
    Private Sub New(name As String) 
     MyBase.new(name) ' call base ctor which can initialize ReadOnly field 
    End Sub 

    Public Sub New() 
     Me.New("MyClassV0.0") ' call private ctor of the current class 
    End Sub 
End Class 
+0

Я получаю: '' MustOverride' недопустим при объявлении переменной-члена '. в компиляторе. То же самое касается «Overridable». – Shuri2060

+0

Упс не видел, что это поле, а не как общественное. Хорошо, если вам нужна какая-то проверка в какой-то момент в иерархии, это должно быть свойство. Вместо этого, если все экземпляры одного и того же типа имеют одинаковое «имя», это должен быть общий член – Sehnsucht

+0

Да - все экземпляры класса будут иметь одинаковое «имя». На самом деле, я привык объявлять переменные, как показано в моем примере кода, и никогда не чувствовал необходимости объявлять их как «Свойство». Я предположил, что нет никакой разницы, кроме хлопот написания методов get/set. – Shuri2060

0

код, предложенный Sehnsucht в комментарии, который работает для меня (с использованием VB 2010, в настоящее время). Решение состоит в том, чтобы использовать свойство вместо этого.

Public MustInherit Class MyBaseClass 

    Public MustOverride ReadOnly Property name As String 

    ... 

End Class 

Public Class MyClassV0_0 : Inherits MyBaseClass 

    Public Overrides ReadOnly Property name As String 
     Get 
      Return "MyClass v0.0" 
     End Get 
    End Property 

    ... 

End Class 
+0

Мое решение включает свойство как в базе, так и в производной;) – Sehnsucht

+0

@Sehnsucht oh - скопировать ошибку патча. Не заметили этого, спасибо – Shuri2060

+0

, вы должны прочитать о [Автореализованные свойства] (https://msdn.microsoft.com/en-us/library/dd293589.aspx), чтобы уменьшить шум при использовании свойств (если вы не используете старая версия Visual Studio, которая их не поддерживает) – Sehnsucht

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

  • Нет связанных вопросов^_^