为什么不能在.net中使用读/写属性覆盖只读属性?

时间:2011-03-23 13:57:04

标签: .net vb.net

从概念上讲,似乎派生类应该能够使用读写属性覆盖readonly属性。为什么这不可能?

Public Class Base

    Protected _name As String
    Public Overridable ReadOnly Property Name() As String
        Get
            return _name
        End Get
    End Property

End Class

Public Class Derived
    Inherits Base

    Public Overrides Property Name() As String
        Get
            Return MyBase.Name
        End Get
        Set(ByVal value As String)
            _name = value
        End Set
    End Property

End Class

4 个答案:

答案 0 :(得分:2)

属性是具有存取方法的“构造”。

当您将Overridable关键字放在属性中时,它将应用于其访问者。

对于只读属性,您只有get访问者,因此它是Overridable

在您的派生类中,您将该属性标记为Overrides,但您只能 覆盖get访问者,因为它是唯一的Overridable访问者。如果你随后包含一个set访问者,则没有任何内容可以覆盖,所以你得到了这个错误。

我认为这在IL中是可能的,但在VB.NET或C#中是不可能的。

>

Public Class Derived
    Inherits Base

    Public Shadows Property Name() As String
        Get
            Return MyBase.Name
        End Get
        Set(ByVal value As String)
            _name = value
        End Set
    End Property

End Class

你可以在基类中提供一个空的setter(或者抛出NotSupportedException的那个),在子类中将是Overridable

您可以在属性定义之外提供另一种方法来进行设置:

Public Sub SetName(ByVal value As String)
    _name = value
End Sub

答案 1 :(得分:2)

答案 2 :(得分:2)

我不同意,更改基类属性的ReadOnly访问似乎是无稽之谈。

VBs ReadOnly的规则经过精心定义: http://msdn.microsoft.com/en-us/library/z2b2c2ka.aspx#Y300

基类作者将属性标记为只读。

您不知道更改房产价值的后果是什么。

答案 3 :(得分:1)

我认为你不应该这样做 - VB.NET语言根本不允许这样做。我猜测为什么是因为接口上的属性使用ReadOnly修饰符来确定它是否应该有一个Getter / Setter,而不是getter / setter的存在。你可以得到的最接近的是更改基数以使setter抛出异常,Derived类覆盖它:

Public Class Base
    Protected _name As String
    Public Overridable Property Name() As String
        Get
            Return _name
        End Get

        Set(ByVal value As String)
            Throw New Exception("Can't do it")
        End Set
    End Property
End Class

Public Class Derived
    Inherits Base
    Public Overrides Property Name() As String
        Get
            Return _name
        End Get
        Set(ByVal value As String)
            _name = value
        End Set
    End Property
End Class