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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top