为什么? Redeclare实现接口的东西?!在VB.NET中
-
05-07-2019 - |
题
我在VB.NET v2工作
我有一个界面 IMyInterface ,这个界面实现了一个方法 MyMethod 。
我有一个对象 MyObjectBase 。该对象包含(相同)方法 MyMethod 。
1)如果现在我做 MyObject Inherits MyObjectBase Implements IMyInterface
需要我重新定义吗? (shadow,override) MyMethod
在 MyObject
类中?
2)现在,如果使用 MyMethod
方法我有 MyEvent
事件?
感谢。
解决方案
在VB.NET中,您需要手动将您的接口合同与您的实现相关联。看看下面的例子:
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
然后看看下面的代码及其输出:
Dim x As New TestClass()
x.Foo() ' Output: Foo '
Dim y As MyInterface = x
y.Foo() ' Output: Test '
这样做的好处是,实现接口并不会限制您根据需要命名您的功能。缺点是您必须使用 Implements
关键字将您的类方法与接口声明明确关联。
解释如此之多。现在让我解决你的问题:既然你不能让 Button
实现IVisibleChanged,你可以这样做:
Private Event MyVisibleChanged() Implements IVisibleChanged.VisibleChanged
Private Sub RethrowVisibleChanged() Handles MyBase.VisibleChanged
RaiseEvent MyVisibleChanged()
End Sub
MyBase
是一个引用超类的VB.NET关键字。同样,对于 MyMethod
,您可以执行
Private Sub MyInterfaceMethod() Implements IMyInterface.Method
MyBase.Method()
End Sub
这似乎是不必要的额外工作,但在某种程度上,它是有道理的: Button.VisibleChanged
和 IVisibleChanged.VisibleChanged
可能是具有两个完全不同的语义的事件,恰好具有相同名称的人(毕竟 Button
实现 IVisibleChanged
)。使用您的代码,您可以明确地在这两者之间建立连接。
其他提示
这是因为你实现了你的子类,你必须重新定义它。我相信如果你只是继承了基本案例,无论如何都要实现,如果你不需要它,你就不必这样做。
不隶属于 StackOverflow