Установить или переопределить только для чтения свойство базового класса

vb.net inheritance properties readonly

893 просмотра

2 ответа

Я хочу изменить 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)

Отладка отпечатков: None

Тем не менее, я ожидаю, MyClass v0.0что будет напечатан вместо. Есть ли способ для меня, чтобы сделать это?

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

Автор: Shuri2060 Источник Размещён: 08.11.2019 11:13

Ответы (2)


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
Автор: Sehnsucht Размещён: 20.08.2016 11:14

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
Автор: Shuri2060 Размещён: 20.08.2016 11:46
Вопросы из категории :
32x32