¿Por qué? ¿Redeclarar cosas para implementar interfaces? en VB.NET
-
05-07-2019 - |
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.
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.