从概念上讲,似乎派生类应该能够使用读写属性覆盖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
答案 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