Pourquoi? Redéclare les choses pour implémenter des interfaces?! dans VB.NET
-
05-07-2019 - |
Question
Je travaille dans VB.NET v2
J'ai une interface IMyInterface et cette interface implémente une méthode MyMethod .
J'ai un objet MyObjectBase . Cet objet contient une méthode (identique) MyMethod .
1) Si maintenant je fais MyObject hérite de MyObjectBase Implémente IMyInterface
dois-je redéfinir? (ombre, remplacement) MyMethod
dans la classe MyObject
?
2) Et maintenant, si la méthode MyMethod
, j'ai un MyEvent
événement ?
Merci.
La solution
Dans VB.NET, vous devez associer manuellement votre contrat d'interface à vos implémentations. Regardez l'exemple suivant:
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
Regardez ensuite le code suivant et sa sortie:
Dim x As New TestClass()
x.Foo() ' Output: Foo '
Dim y As MyInterface = x
y.Foo() ' Output: Test '
Cela présente l'avantage que la mise en œuvre d'une interface ne vous empêche pas de nommer votre fonction comme vous le souhaitez . L'inconvénient est que vous devez associer explicitement vos méthodes de classe à vos déclarations d'interface à l'aide du mot clé Implements
.
Tant de choses sur une explication. Permettez-moi maintenant de parler de votre problème: comme vous ne pouvez pas obliger le bouton
à implémenter IVisibleChanged, vous pouvez effectuer quelque chose comme ça:
Private Event MyVisibleChanged() Implements IVisibleChanged.VisibleChanged
Private Sub RethrowVisibleChanged() Handles MyBase.VisibleChanged
RaiseEvent MyVisibleChanged()
End Sub
MyBase
est un mot clé VB.NET faisant référence à la superclasse. De même, dans le cas de MyMethod
, vous pouvez faire
Private Sub MyInterfaceMethod() Implements IMyInterface.Method
MyBase.Method()
End Sub
Cela peut sembler être un travail supplémentaire inutile, mais d’une certaine manière, cela a du sens: Button.VisibleChanged
et IVisibleChanged.VisibleChanged
peuvent être des événements avec deux sémantiques complètement différentes, qui ont juste le même nom (après tout, le bouton
ne n'implémente pas IVisibleChanged
). Avec votre code, vous créez explicitement une connexion entre ces deux-là.
Autres conseils
C'est parce que vous implémentez votre classe enfant que vous devez la redéfinir. Je crois que si vous héritez simplement du scénario de base, qui est mis en œuvre de toute façon, vous n’y serez pas obligés si vous n’en avez pas besoin.