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).

7voto

Désolé mais je ne maîtrise pas la syntaxe de VB.Net.

En C#, vous pouvez implémenter des interfaces de manière implicite ou explicite. Si votre classe Foo implémente ErrorMsg en tant que méthode publique, cette implémentation sera utilisée pour les deux interfaces.

Si vous voulez une implémentation distincte, vous pouvez l'implémenter de manière explicite :

string ISimpleInterface.ErrorMsg {get { ... } } 
string IExtendedInterface.ErrorMsg {get { ... } set { ... }}

5voto

Patrick Klug Points 5320

Vous pouvez implémenter l'une ou l'autre de ces interfaces ou les deux avec une implémentation d'interface explicite, afin que le compilateur sache à quelle propriété ErrorMsg appartient chaque interface.

Pour cela, il suffit d'écrire : ISimpleInterface (pour C#) après le nom de votre classe, puis cliquez sur ISimpleInterface et sélectionnez implémenter l'interface explicite.

Plus d'informations ici : http://msdn.microsoft.com/en-us/library/aa288461(VS.71).aspx

4voto

Marc Gravell Points 482669

En C#, une implémentation implicite (avec le set) peut satisfaire ces deux critères :

class Foo : ISimpleInterface, IExtendedInterface
{
    public string ErrorMsg { get; set; }
    public string SomeOtherProperty {get; set;}
}

Si vous souhaitez le modifier, vous pouvez utiliser une implémentation explicite (""Implements"" en VB ?) - en C# :

string ISimpleInterface.ErrorMsg
{
    get { return ErrorMsg; } // ou quelque chose de plus intéressant
}

3voto

Anton Gogolev Points 59794

En C#, vous pouvez utiliser une implémentation explicite d'interface:

class Foo
{
    string ISimpleInterface.ErrorMsg
    { get... }

    string IExtendedInterface.ErrorMsg
    { get... set... }

    string IExtendedInterface.SomeOtherProperty
    { get... set... }
}

ou une carte d'interface

class Foo
{
    public string ErrorMsg
    { get... set... }       

    public string SomeOtherProperty
    { get... set... }
}

En ce qui concerne VB.NET, il a le mot-clé Implements:

Property ErrorMsg As String Implements ISimpleInterface.ErrorMsg

Property OtherErrorMsg As String Implements IExtendedInterface.ErrorMsg

2voto

Hans Passant Points 475940

Le mot-clé Implements en VB.NET facilite cela :

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

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

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

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

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

  Public ReadOnly Property ErrorMsg() As String Implements ISimpleInterface.ErrorMsg
    Get
      Return msg
    End Get
  End Property

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