10 votes

Implémentation de 2 interfaces avec des propriétés de 'même nom'

Cela semble être un scénario raisonnable (et peut-être simple ?), mais comment feriez-vous ce qui suit :

Disons que j'ai 2 interfaces :

Interface ISimpleInterface
    string ErrorMsg { get; } 
End Interface

Interface IExtendedInterface
    string ErrorMsg { get; set; }    
    string SomeOtherProperty { get; set; }
End Interface

Je veux qu'une classe implémente les deux interfaces :

Public Class Foo Implements ISimpleInterface, IExtendedInterface

Comment définir la propriété ErrorMsg dans la classe étant donné que chaque interface a un niveau d'accès différent ?

Voici mon scénario au cas où vous vous poseriez la question : j'écris un UserControl en utilisant une architecture de type MVC pseudo, où le UserControl expose l'interface étendue à son contrôleur, et expose l'interface Simple aux consommateurs du contrôle.

En passant, implémenter cela en VB.NET (toute syntaxe suggérée en VB serait appréciée).

0voto

Gerrie Schenck Points 13421

Vous devrez travailler avec les implémentations d'Interface Explicites. Plus d'informations sur le sujet ici : http://msdn.microsoft.com/en-us/library/aa288461(VS.71).aspx

0voto

RS Conley Points 6268

Vous pouvez avoir des sous-programmes privés implémenter des interfaces. Il n'est exposé que lorsque l'objet est assigné à une variable de ce type d'interface.

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim S As ISimpleInterface
        Dim Ext As IExtendedInterface
        Dim F As New Foo
        F.ErrorMsg = "Test Error"
        S = F
        Ext = F
        MsgBox(S.ErrorMsg)
        MsgBox(Ext.ErrorMsg)
        MsgBox(F.ErrorMsg)
    End Sub
End Class

Public Interface ISimpleInterface
    ReadOnly Property ErrorMsg() As String
End Interface

Public Interface IExtendedInterface
    Property ErrorMsg() As String
    Property SomeOtherProperty() As String
End Interface

Public Class Foo
    Implements ISimpleInterface, IExtendedInterface
    Private other As String
    Private msg As String

    Public Property ErrorMsg() As String Implements IExtendedInterface.ErrorMsg
        Get
            Return msg
        End Get
        Set(ByVal value As String)
            msg = value
        End Set
    End Property

    Public Property SomeOtherProperty() As String Implements IExtendedInterface.SomeOtherProperty
        Get
            Return other
        End Get
        Set(ByVal value As String)
            other = value
        End Set
    End Property

    Private ReadOnly Property ErrorMsgSimple() As String Implements ISimpleInterface.ErrorMsg
        Get
            Return ErrorMsg
        End Get
    End Property

0voto

baretta Points 4391

Alors que la mise en œuvre explicite résoudra ce problème, comme le montrent d'autres, dans ce cas précis, je laisserais probablement IExtendedInterface implémenter ISimpleInterface (la propriété ErrorMsg est sémantiquement la même propriété, elle signifie la même chose dans ces 2 interfaces je suppose).

interface ISimpleInterface
{
    string ErrorMessage { get; set; }
}
interface IExtendedInterface : ISimpleInterface
{
    string SomeOtherProperty { get; set; }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X