Por quê? Redeclare coisas para implementar as interfaces ?! em VB.NET
-
05-07-2019 - |
Pergunta
Eu trabalho em VB.NET v2
Eu tenho uma interface IMyInterface e esta interface implementa um método MyMethod .
Eu tenho um objeto MyObjectBase . Este objeto contém um (o mesmo) método MyMethod .
1) Se agora eu faço MyObject Inherits MyObjectBase Implements IMyInterface
eu preciso redefinir? MyMethod
(sombra, override) na classe MyObject
?
2) O que agora se, em vez do método MyMethod
Eu tenho um MyEvent
evento ?
Graças.
Solução
Em VB.NET, você precisa manualmente associar o seu contrato de interface com suas implementações. Dê uma olhada no exemplo a seguir:
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
Em seguida, ter um olhar para o seguinte código e sua saída:
Dim x As New TestClass()
x.Foo() ' Output: Foo '
Dim y As MyInterface = x
y.Foo() ' Output: Test '
Isto tem a vantagem que a implementação de uma interface não restringi-lo em nomear sua função como você quer . A desvantagem é que você tem que associar explicitamente os seus métodos de classe com seus declarações de interface utilizando palavras-chave Implements
.
Tanta coisa sobre uma explicação. Agora deixe-me chegar ao seu problema: Desde que você não pode fazer Button
implementar IVisibleChanged, você pode fazer algo assim:
Private Event MyVisibleChanged() Implements IVisibleChanged.VisibleChanged
Private Sub RethrowVisibleChanged() Handles MyBase.VisibleChanged
RaiseEvent MyVisibleChanged()
End Sub
MyBase
é um VB.NET chave referindo-se a superclasse. Da mesma forma, no caso de MyMethod
, você pode fazer
Private Sub MyInterfaceMethod() Implements IMyInterface.Method
MyBase.Method()
End Sub
Isto pode parecer um trabalho extra desnecessário, mas de certa forma, faz sentido: Button.VisibleChanged
e IVisibleChanged.VisibleChanged
pode ser eventos com dois semântica completamente diferentes, que só acontecerá a ter o mesmo nome (afinal Button
não implementar IVisibleChanged
). Com o código, você cria explicitamente uma conexão entre os dois.
Outras dicas
É porque você implementar sua classe filha que você tem que redefini-la. Acredito que, se você acabou de herdar o caso base, que é implementado de qualquer forma, você não terá que se você não precisa dele.