这在具有属性的VB.NET中似乎不可能,因为属性语句本身必须描述它是否是ReadOnly
.
在我下面的例子中,它不允许我进行ReadWriteChild
编译.我想我可以让父读/写,然后让ReadOnlyChild的setter不做任何事情,但这似乎有点hacky.在这种情况下,最好的替代方案似乎是放弃属性而采用getter/setter方法.
Public MustInherit Class Parent
Public MustOverride ReadOnly Property Foo() As String
End Class
Public Class ReadOnlyChild
Inherits Parent
Public Overrides ReadOnly Property Foo() As String
Get
' Get the Property
End Get
End Property
End Class
Public Class ReadWriteChild
Inherits Parent
Public Overrides Property Foo() As String
Get
' Get the property.
End Get
Set(ByVal value As String)
' Set the property.
End Set
End Property
End Class
CraigTP.. 6
鉴于您要完成的任务,以及您发布的示例代码,VB.NET将不允许您这样做.
通常,您可以在VB.NET中声明属性,如下所示:
Public Class qwqwqw
Public Property xyz() As String
Get
Return ""
End Get
Private Set(ByVal value As String)
'
End Set
End Property
End Class
基本上将整体属性标记为公共属性,但为setter(或getter)提供更具限制性的范围.
您的案例中的主要问题是MustInherit(即抽象)基类.由于您在其中定义的属性标记为MustOverride,因此您无法提供默认实现(即,它也是抽象的),这包括"获取"和"设置"轮廓,因此,无论哪个"整体" "你给这个抽象的财产申报范围,VB.NET将强制您使用此范围内为双方的getter和派生类中的setter方法.
其基类的属性将强制所有派生类和这个属性的实现也成为只读的只读预选赛.离开关只读预选赛仍然无法工作,因为无论范围你给抽象属性将是你必须派生出来的系统内,向getter和setter方法既范围.
例如:
Public MustInherit Class Parent
Public MustOverride Property Foo() As String
End Class
Public Class ReadOnlyChild
Inherits Parent
Public Overrides Property Foo() As String
Get
'
End Get
Private Set(ByVal value As String)
'
End Set
End Property
End Class
(注意setter上的私有作用域).作为VB.NET的坚持,因为你重写基类的属性,你的整个属性必须具有相同的范围,因为你重写属性(在这种情况下,公共)这将无法正常工作.
尝试使基类的抽象属性受到保护也不起作用,因为您需要在与基类中声明的作用域相同的级别(即受保护的)上实现该属性.通常,在不使用特定的作用域级别覆盖基类的抽象定义时,可以为getter或setter提供更严格的作用域级别,但是不能给它一个限制较少的作用域级别.
因此:
Public MustInherit Class Parent
Protected MustOverride Property Foo() As String
End Class
Public Class ReadOnlyChild
Inherits Parent
Protected Overrides Property Foo() As String
Public Get
'
End Get
Set(ByVal value As String)
'
End Set
End Property
End Class
(注意吸气剂的公共范围).由于公共范围的限制性小于受保护的整体属性范围,而且不是与基类的抽象属性声明中定义的范围级别相同,因此不起作用.
如果您的类的设计正如您在问题中提到的那样,我个人会使用"java风格"的getter和setter 方法,因为它们可以使用自己的范围级别单独声明.
鉴于您要完成的任务,以及您发布的示例代码,VB.NET将不允许您这样做.
通常,您可以在VB.NET中声明属性,如下所示:
Public Class qwqwqw
Public Property xyz() As String
Get
Return ""
End Get
Private Set(ByVal value As String)
'
End Set
End Property
End Class
基本上将整体属性标记为公共属性,但为setter(或getter)提供更具限制性的范围.
您的案例中的主要问题是MustInherit(即抽象)基类.由于您在其中定义的属性标记为MustOverride,因此您无法提供默认实现(即,它也是抽象的),这包括"获取"和"设置"轮廓,因此,无论哪个"整体" "你给这个抽象的财产申报范围,VB.NET将强制您使用此范围内为双方的getter和派生类中的setter方法.
其基类的属性将强制所有派生类和这个属性的实现也成为只读的只读预选赛.离开关只读预选赛仍然无法工作,因为无论范围你给抽象属性将是你必须派生出来的系统内,向getter和setter方法既范围.
例如:
Public MustInherit Class Parent
Public MustOverride Property Foo() As String
End Class
Public Class ReadOnlyChild
Inherits Parent
Public Overrides Property Foo() As String
Get
'
End Get
Private Set(ByVal value As String)
'
End Set
End Property
End Class
(注意setter上的私有作用域).作为VB.NET的坚持,因为你重写基类的属性,你的整个属性必须具有相同的范围,因为你重写属性(在这种情况下,公共)这将无法正常工作.
尝试使基类的抽象属性受到保护也不起作用,因为您需要在与基类中声明的作用域相同的级别(即受保护的)上实现该属性.通常,在不使用特定的作用域级别覆盖基类的抽象定义时,可以为getter或setter提供更严格的作用域级别,但是不能给它一个限制较少的作用域级别.
因此:
Public MustInherit Class Parent
Protected MustOverride Property Foo() As String
End Class
Public Class ReadOnlyChild
Inherits Parent
Protected Overrides Property Foo() As String
Public Get
'
End Get
Set(ByVal value As String)
'
End Set
End Property
End Class
(注意吸气剂的公共范围).由于公共范围的限制性小于受保护的整体属性范围,而且不是与基类的抽象属性声明中定义的范围级别相同,因此不起作用.
如果您的类的设计正如您在问题中提到的那样,我个人会使用"java风格"的getter和setter 方法,因为它们可以使用自己的范围级别单独声明.