使用重载的成员vb.net实现继承的接口

时间:2013-06-20 21:01:11

标签: vb.net inheritance interface overloading implements

我正在尝试在类中实现派生接口。我的接口和类与以下类似。命名空间涉及包含这些接口和类的不同项目:

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,都会出现错误 - 都会导致错误。

无论如何要完成我想要做的事情 - 只使用接口在我的类中实现派生接口的功能?如果没有办法使用接口,有人可以提出另一种方式吗?我们确实需要使用接口并试图避免使用类。也就是说,抽象类我允许我们做所有我们需要做的事情。

我已经阅读了有关此问题涵盖的所有主题的大量信息,因为每个概念都非常基本且在在线帮助中有很好的涵盖。但是,我没有找到任何我认为可以直接解决我的具体问题的方法。

提前感谢您的帮助。

2 个答案:

答案 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