如何在“ReadOnly”中继承一个类并转换其公共属性?

时间:2012-05-24 15:18:47

标签: .net vb.net class inheritance properties

我有一个这样的课程

Public Class Settings

        Private _app_folder As String = ""
        Public Property AppFolder() As String
            Get
                Return _app_folder
            End Get
            Set(ByVal value As String)
                _app_folder = value
            End Set
        End Property [...]

然后在另一个班级,我宣布它

_settings = New Settings

我设置了每个属性的值

_settings.AppFolder = "test"

但是如何将“_settings.AppFolder”属性编辑为“readonly”?

5 个答案:

答案 0 :(得分:2)

如果你想让AppFolder 始终 ReadOnly,你可以简单地声明:

Private _app_folder As String = ""
Public ReadOnly Property AppFolder() As String
    Get
        Return _app_folder
    End Get
End Property [...]

如果你想在子类中创建ReadOnly,那么你只能通过在客户端代码尝试设置它时抛出异常来做到这一点 - 不可能删除子类的setter。

Public Class SubSettings inherits Settings
    Private _app_folder As String = ""
    Public Property AppFolder() As String
        Get
            Return _app_folder
        End Get
        Set(ByVal value As String)
            throw new Exception ("This property cannot be set")
        End Set
    End Property [...]

最后,如果你想在它的初始设置之后使它成为ReadOnly:

    Private _app_folder As String = ""
    Private hasBeenSet as Boolean = False;
    Public Property AppFolder() As String
        Get
            Return _app_folder
        End Get
        Set(ByVal value As String)
            If (hasBeenSet)
                throw new Exception ("This property cannot be set")
            Else
                hasBeenSet = true
                _app_folder = value
            EndIf
        End Set
    End Property [...]

答案 1 :(得分:2)

除了RB的答案,你可以实现一个接口,并在你需要属性的只读行为时使用它(而不是类)。

Public Interface IReadonlySettings
    ReadOnly Property AppFolder() As String
End Interface

Public Class Settings
    Implements IReadonlySettings

    Private m_AppFolder As String

    Public Property AppFolder() As String
        Get
            Return m_AppFolder
        End Get
        Set
            m_AppFolder = Value
        End Set
    End Property

    private readonly Property ReadonlyAppFolder() As String implements IReadonlySettings.AppFolder
        Get
            Return m_AppFolder
        End Get
    End Property

End Class

答案 2 :(得分:2)

另一个选择是更改属性Set的访问权限 - 它可以与Get不同。例如,您可以声明属性Public,但声明Set为Protected。在这种情况下,任何人都可以阅读该属性,但只有类本身及其衍生物可以写入属性。声明Set为Friend将允许类本身和同一程序集中的任何其他类来编写属性。

答案 3 :(得分:0)

使用ReadOnly关键字

Public ReadOnly Property AppFolder() As String
        Get
            Return _app_folder
        End Get
    End Property 

答案 4 :(得分:0)

如果你确实在谈论继承,那么答案就是 - 你做不到。这会破坏继承:派生类对象是一个基类对象。因此,如果您有类DerivedBase,则无法使此代码无法编译:

Dim d As Base = New Derived()
d.SomeProperty = SomeValue

这必须有效。