que - implementacion de interfaces c#
Implementación de 2 interfaces con las propiedades del ''mismo nombre'' (8)
Deberá trabajar con implementaciones de interfaz explícita. Más sobre el tema aquí: http://msdn.microsoft.com/en-us/library/aa288461(VS.71).aspx
Esto parece un escenario razonable (¿y quizás simple?), Pero ¿cómo harías lo siguiente?
Digamos que tengo 2 interfaces:
Interface ISimpleInterface
string ErrorMsg { get; }
End Interface
Interface IExtendedInterface
string ErrorMsg { get; set; }
string SomeOtherProperty { get; set; }
End Interface
Quiero una clase para implementar ambas interfaces:
Public Class Foo Implements ISimpleInterface, IExtendedInterface
¿Cómo defino la propiedad ErrorMsg en la clase dado que cada interfaz tiene un nivel de acceso diferente?
Esta es mi situación en caso de que se esté preguntando: estoy escribiendo un UserControl usando una arquitectura psuedo MVC, donde el UserControl expone la interfaz extendida a su Controlador, y expone la interfaz Simple a los Consumidores del control.
Por cierto, implementar esto en VB.NET (cualquier synatx sugerido en vb sería apreciado).
En C # puede usar la implementación explícita de la interfaz:
class Foo
{
string ISimpleInterface.ErrorMsg
{ get... }
string IExtendedInterface.ErrorMsg
{ get... set... }
string IExtendedInterface.SomeOtherProperty
{ get... set... }
}
o asignación de interfaz
class Foo
{
public string ErrorMsg
{ get... set... }
public string SomeOtherProperty
{ get... set... }
}
En cuanto a VB.NET, tiene Implements
palabra clave:
Property ErrorMsg As String Implements ISimpleInterface.ErrorMsg
Property OtherErrorMsg As String Implements IExtendedInterface.ErrorMsg
En C #, una implementación implícita (con el set
) puede satisfacer ambos:
class Foo : ISimpleInterface, IExtendedInterface
{
public string ErrorMsg { get; set; }
public string SomeOtherProperty {get; set;}
}
Si desea cambiarlo, puede usar la implementación explícita ("Implements" en VB?) - en C #:
string ISimpleInterface.ErrorMsg
{
get { return ErrorMsg; } // or something more interesting
}
Lo siento pero no domino la sintaxis de VB.Net.
En C # puede implementar interfaces implícita o explícitamente. Si su clase Foo implementa ErrorMsg como método público, esta implementación se usará para ambas interfaces.
Si desea una implementación distinta, puede implementarla explícitamente:
string ISimpleInterface.ErrorMsg {get { ... } }
string IExtendedInterface.ErrorMsg {get { ... } set { ... }}
Puede implementar una de ellas o ambas interfaces con una implementación de ''interfaz explícita'', de modo que el compilador sepa a qué propiedad de ErrorMsg pertenece cada interfaz.
Para hacerlo, simplemente escriba: ISimpleInterface (para C #) después del nombre de su clase y luego haga clic en ISimpleInterface y seleccione implementar la interfaz explícita.
Más información aquí: http://msdn.microsoft.com/en-us/library/aa288461(VS.71).aspx
Si bien la implementación explícita lo resolverá, como lo muestran otros, en este caso probablemente dejaría que IExtendedInterface implemente ISimpleInterface (la propiedad ErrorMsg es semánticamente la misma propiedad, significa lo mismo en estas 2 interfaces, supongo).
interface ISimpleInterface
{
string ErrorMessage { get; set; }
}
interface IExtendedInterface : ISimpleInterface
{
string SomeOtherProperty { get; set; }
}
La palabra clave Implements en VB.NET lo hace fácil:
Public Interface ISimpleInterface
ReadOnly Property ErrorMsg() As String
End Interface
Friend 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 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
End Class
Puede hacer que las subrutinas privadas implementen las interfaces. Solo se expone cuando el objeto se asigna a una variable de ese tipo de interfaz.
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
End Class