1

私はこのようなクラスを持っています

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」プロパティを「読み取り専用」に編集するにはどうすればよいですか?

4

5 に答える 5

2

もう1つのオプションは、プロパティのSetのアクセスを変更することです。これはGetとは異なる場合があります。たとえば、プロパティをPublicと宣言し、SetをProtectedと宣言することができます。この場合、誰でもプロパティを読み取ることができますが、クラス自体とその派生物のみがプロパティを書き込むことができます。SetをFriendとして宣言すると、クラス自体と同じアセンブリ内の他のクラスがプロパティを書き込むことができます。

于 2012-10-08T13:02:45.380 に答える
2

AppFolderを常に読み取り専用にしたい場合は、次のように簡単に宣言できます。

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

サブクラスで読み取り専用にしたい場合は、クライアントコードがそれを設定しようとするたびに例外をスローすることによってのみこれを行うことができます.サブクラスのセッターを削除することはできません.

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 [...]
于 2012-05-24T15:28:34.463 に答える
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
于 2012-05-24T15:41:56.077 に答える
0

ReadOnlyキーワードを使用する

Public ReadOnly Property AppFolder() As String
        Get
            Return _app_folder
        End Get
    End Property 
于 2012-05-24T15:25:17.860 に答える
0

本当に継承について話しているのであれば、答えは - できません。これは継承を壊します: 派生クラス オブジェクトは基本クラス オブジェクトです。したがって、クラスがDerivedありBase、このコードをコンパイルしないようにする方法がない場合:

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

これはうまくいくはずです。

于 2012-05-24T15:27:44.473 に答える