una que programacion interfaz interfaces implementacion declaracion caracteristicas c# vb.net multiple-inheritance

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