我正在尝试在类中实现派生接口。我的接口和类与以下类似。命名空间涉及包含这些接口和类的不同项目:
Namespace ns1
Public Interface IParent
Function myFunction() As Double
End Interface
End ns1
Namespace ns2
Public Interface IDerived
Inherits ns1.IParent
Overloads / Shadows Function myFunction(ByRef myObject as Object) As Double
End Interface
End ns2
Namespace ns3
Public Class myClass
Implements ns2.IDerived
Public Function myFunction(ByRef obj as Object) As Double Implements ns2.IDerived.myFunction
End Function
End ns3
在派生接口中,我试图以一种方式重载函数,当我实现派生接口时,我只需实现其中定义的函数 - 就像上面“myClass”中的代码一样。但是,我收到一个错误,说我还必须从父接口(使用空参数列表)实现该函数。无论我在派生接口中使用函数的Overloads还是Shadows,都会出现错误 - 都会导致错误。
无论如何要完成我想要做的事情 - 只使用接口在我的类中实现派生接口的功能?如果没有办法使用接口,有人可以提出另一种方式吗?我们确实需要使用接口并试图避免使用类。也就是说,抽象类我允许我们做所有我们需要做的事情。
我已经阅读了有关此问题涵盖的所有主题的大量信息,因为每个概念都非常基本且在在线帮助中有很好的涵盖。但是,我没有找到任何我认为可以直接解决我的具体问题的方法。
提前感谢您的帮助。
答案 0 :(得分:1)
我不相信你想要实现的是你可能尝试的方式...我记得当你继承一个接口时,任何实现派生接口的类实际上都被告知它必须实现两个接口而不是允许您在完整课程中拥有的选项。
你在myClass中有效的是:
Namespace ns3
Public Class myClass
Implements ns2.IDerived
Implements ns1.IParent
Public Function myFunction(ByRef obj as Object) As Double Implements ns2.IDerived.myFunction
End Function
End ns3
因此,继承接口实际上只是一种强制实现派生接口的类也必须实现基接口的方法。
答案 1 :(得分:1)
我不知道这是否是一个拼写错误,但你有两个不同的方法:一个不带参数,另一个带一个对象,所以编译器要求是合法的。
如果这是一个拼写错误并且您只有一种方法,比如说“ myFunction()”,那么我担心VB.Net不会像 C#那样简单隐藏基接口并允许仅实现派生接口。
但您可以通过转发轻松解决此问题:
Namespace ns1
Public Interface IParent
Function myFunction() As Double
End Interface
End Namespace
Namespace ns2
Public Interface IDerived
Inherits ns1.IParent
Function myFunction() As Double
End Interface
End Namespace
Namespace ns3
Public Class Class1
Implements ns2.IDerived
Public Function myFunction() As Double Implements ns2.IDerived.myFunction
Return 42
End Function
Private Function myFunction1() As Double Implements ns1.IParent.myFunction
Return myFunction()
End Function
End Class
End Namespace
Module Module1
Sub Main()
Dim cp As ns1.IParent = New ns3.Class1
cp.myFunction()
Dim cd As ns2.IDerived = New ns3.Class1
cd.myFunction()
End Sub
End Module
修改强> 所以不是一个错字,这是标准(好/最佳实践?)修复:
Public Class Class1
Implements ns2.IDerived
Public Function myFunction(ByRef obj As Object) As Double Implements ns2.IDerived.myFunction
End Function
Public Function myFunction() As Double Implements ns1.IParent.myFunction
Throw New NotImplementedException("'ns1.IParent.myFunction' has not been implemented because unicorns can't fly!")
End Function
End Class