0

セッターにフレンドレベルのスコープを設定すると、次のようになります...

Public Class MyClass
    Public Property IsDirty() As Boolean
        Get
            Return _isDirty
        End Get
        Friend Set(ByVal trueFalse As Boolean)
            _isDirty = trueFalse
        End Set
    End  Property
End Class

...そして別のプロジェクトからそれを呼び出すと、それは正しく機能します。MyClass.IsDirty=Trueのようなことはできません。

素晴らしい!それがまさに私が欲しいものです。

しかし、インターフェイスを定義すると、実際にそれを行う必要があります。

Public Interface IMyClass
    Property IsDirty() As Boolean
End Interface

私は次のようなことができます:

Dim MyInstance as IMyClass= GetSomeInstanceOfMyClass()
MyInstance.IsDirty=True

...そして、奇妙なことに、それは実行されます!例外はスローされず、内部変数はTrueに設定されます。フレンドスコープを完全に無視します!

それは恐ろしいです。何が足りないの?

注: APIを設計しているため、これが必要です。内部APIでIsDirtyを設定できるようにしたいのですが、エンド開発者はそれに入ることができないはずです。現在、この機能を取得するためにクラス全体をファサードでラップしていますが、ファサードは不要である必要があります。

4

2 に答える 2

1

インターフェイスメソッドは常にパブリックアクセス可能です。クラスメソッドを非表示にするだけの明示的なインターフェイス実装でこれを修正することはできません。オブジェクトをインターフェイスタイプにキャストするだけで、自由にアクセスできるようになります。

編集:実際には、問題は簡単に解決できます。インターフェイス宣言でプロパティReadOnlyを宣言するだけです:)

例えば:

Public Interface IMyClass
    ReadOnly Property IsDirty() As Boolean
End Interface

Public Class Test
    Implements IMyClass
    Private mIsDirty As Boolean
    Private ReadOnly Property IsDirtyImpl() As Boolean Implements IMyClass.IsDirty
        Get
            Return mIsDirty
        End Get
    End Property
    Public Property IsDirty() As Boolean
        Get
            Return mIsDirty
        End Get
        Friend Set(ByVal value As Boolean)
            mIsDirty = value
        End Set
    End Property
End Class
于 2009-02-05T20:14:32.497 に答える
1

欠けているのは、暗黙的で明示的なインターフェース実装の概念です。詳細については、この質問への回答を参照してください

また、フレンドセッターで恐ろしいと思われる場合は、プライベートに設定して、インターフェースからアクセスできることを確認してください。

于 2009-02-05T19:52:25.520 に答える