2

シェルの例を以下に示します。基本的に、クライアントと従業員にIPersonからのSSNプロパティを実装してもらいたいです。ただし、クライアントにgetとsetを設定してもらいたいのですが(これは問題ではありません)、従業員にはgetのみを設定してもらいたいです。

Public Interface IPerson
    Property SSN As String
End Interface

Public Class Client
    Implements IPerson
    Public Property SSN As String Implements AELName.IPerson.SSN
        Get
            Return _SSN
        End Get
        Set(value As String)
            _SSN = value
        End Set
    End Property
End Class

Public Class Employee
    Implements IPerson
    Public Readonly Property SSN As String Implements AELName.IPerson.SSN
        Get
            Return _SSN
        End Get
    End Property
End Class

従業員は、「インターフェイス'IPerson'に一致するプロパティがないため、'SSN'は'SSN'を実装できません」というエラーを生成します。従業員のSSN実装をオーバーライドする簡単な方法はありますか?

4

3 に答える 3

5

空を実装できますSet-何も更新しないものです。

Public Class Employee
    Implements IPerson
    Public Readonly Property SSN As String Implements AELName.IPerson.SSN
        Get
            Return _SSN
        End Get
        Set
            ' Make read only for Employee
        End Set
    End Property
End Class
于 2012-06-28T21:19:34.793 に答える
2

インターフェイスをIReadablePersonとIReadWritePersonに分割し、後者が前者を継承することをお勧めします。前者のインターフェースはそうではないことに注意してくださいIImmutablePerson。後者の名前は、クラスのコンシューマーに、そのプロパティが変更されることを期待してはならないことを意味するためです。実装するオブジェクトIReadWritePersonは、そのような期待には従いませんが、人が読みやすくなければならないという期待には従います。

インターフェイスを分割する際のちょっとした煩わしさの1つは、の読み取り/書き込みプロパティの宣言にIReadWritePerson修飾子を含める必要があることです。の実装者は、の読み取り専用実装との読み取り/書き込み実装の両方を提供する必要があります。 。C#では、読み取り/書き込みプロパティのパブリック実装は、クラスが実装するインターフェイスの一部である、同じ名前の読み取り専用、書き込み専用、または読み取り/書き込みプロパティの実装を自動的に生成できますが、明示的にどのインターフェイスを宣言するか実装されている場合、インターフェイスのスタイル(読み取り専用、書き込み専用、読み取り/書き込み)は、実装のスタイルと正確に一致する必要があります。迷惑。ShadowsIReadWritePersonIReadablePersonIReadWritePerson

IReadableFoo読み取り専用プロパティIWriteOnlyFooと書き込み専用プロパティで単純に宣言することはできず、IReadWriteFoo単に両方を継承しているという事実によって、煩わしさはさらに悪化します。インターフェイスが同じ名前の読み取り専用プロパティと書き込み専用プロパティを実装している場合、コンパイラはまたはのようなステートメントで、使用する実装が「あいまい」であることをアナウンスするため、どちらのプロパティも使用できませsomevariable = object.somePropertysomeObject.someProperty = someVariable。あいまいさがわかるわけではありません。前者がゲッター以外のものを使用する方法、または後者がセッター以外のものを使用する方法はわかりませんが、コンパイラーはそれを解決できません。

于 2012-06-28T22:21:09.140 に答える
0

タイトルの質問「インターフェイスプロパティをオーバーライドできますか」に答えるには...もちろんです。これを行う方法の例を次に示します。基本の具象実装にOverridableキーワードを追加するだけです。プロパティをReadOnlyに変更しても解決しないことはわかっていますが、インターフェイスの基本クラスの具体的な実装をオーバーライドすることは可能であると指摘しました。

Module Module1

    Sub Main()

        Dim iEntity As IEntity = New MyEntity

        iEntity.SetMessage(iEntity)

        Console.WriteLine(iEntity.Message)

        Console.ReadKey()

    End Sub

End Module

Public Interface IEntity

    Property Message As String

    Sub SetMessage(entity As IEntity)

End Interface


Public Class MyEntity
    Inherits BaseEntity

    Public Overrides Property Message As String
        Get
            Return String.Format("{0}.. and overroad.", MyBase.Message)
        End Get
        Set(value As String)
            MyBase.Message = value
        End Set
    End Property

    Public Overrides Sub SetMessage(entity As IEntity)

        Me.Message = "I was set from MyEntity."

    End Sub

End Class


Public Class BaseEntity
    Implements IEntity

    Public Overridable Property Message As String Implements IEntity.Message

    Public Overridable Sub SetMessage(entity As IEntity) Implements IEntity.SetMessage
        Me.Message = "I was set from BaseEntity."
    End Sub

End Class
于 2013-10-11T04:12:36.793 に答える