Pregunta

Yo trabajo en VB.NET v2

Tengo una interfaz IMyInterface y esta interfaz implementa un método MyMethod .

Tengo un objeto MyObjectBase . Este objeto contiene un (el mismo) método MyMethod .

1) Si ahora hago MyObject Hereda MyObjectBase Implements IMyInterface ¿Debo redefinir? (shadow, override) MyMethod en la clase MyObject ?

2) ¿Qué sucede ahora si, en cambio, el método MyMethod tengo un MyEvent evento ?

Gracias.

¿Fue útil?

Solución

En VB.NET, debe manualmente asociar su contrato de interfaz con sus implementaciones. Echa un vistazo al siguiente ejemplo:

Interface MyInterface
    Sub Foo()
End Interface

Class TestClass
    Implements MyInterface

    Public Sub Test() Implements MyInterface.Foo
        Console.WriteLine("Test")
    End Sub

    Public Sub Foo()
        Console.WriteLine("Foo")
    End Sub
End Class

Luego eche un vistazo al siguiente código y su salida:

Dim x As New TestClass()
x.Foo()                           ' Output: Foo '
Dim y As MyInterface = x
y.Foo()                           ' Output: Test '

Esto tiene la ventaja de que la implementación de una interfaz no le restringe a la hora de asignar un nombre a su función como desee . La desventaja es que tiene que asociar explícitamente sus métodos de clase con sus declaraciones de interfaz usando la palabra clave Implements .


Mucho sobre una explicación. Ahora permítame llegar a su problema: ya que no puede hacer que el Button implemente IVisibleChanged, puede hacer algo como eso:

Private Event MyVisibleChanged() Implements IVisibleChanged.VisibleChanged

Private Sub RethrowVisibleChanged() Handles MyBase.VisibleChanged
    RaiseEvent MyVisibleChanged()
End Sub

MyBase es una palabra clave VB.NET que se refiere a la superclase. Del mismo modo, en el caso de MyMethod , puede hacer

Private Sub MyInterfaceMethod() Implements IMyInterface.Method
    MyBase.Method()
End Sub

Esto puede parecer un trabajo adicional innecesario, pero en cierto sentido, tiene sentido: Button.VisibleChanged y IVisibleChanged.VisibleChanged pueden ser eventos con dos semánticas completamente diferentes, que acaba de tener el mismo nombre (después de que todo Button no implemente IVisibleChanged ). Con tu código, creas explícitamente una conexión entre esos dos.

Otros consejos

Debido a que implementas tu clase secundaria, debes redefinirla. Creo que si simplemente hereda del caso base, que se implementa de todos modos, no tendrá que hacerlo si no lo necesita.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top