4

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

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”上的代码所做的那样。但是,我收到一条错误消息,说我还必须从父接口(使用空参数列表)实现该函数。无论我在派生接口中的函数上使用重载还是阴影,错误都存在 - 两者都会导致错误。

有没有办法完成我想做的事情——在我的类中只实现派生接口的函数——使用接口?如果没有使用接口的方法,任何人都可以建议另一种方法吗?我们确实需要使用接口并试图避免使用类。也就是说,抽象类允许我们做所有我们需要做的事情。

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

提前感谢您的帮助。

4

2 回答 2

2

我不相信你想要完成的事情可能是你尝试的方式......我记得当你继承一个接口时,任何实现派生接口的类实际上都被告知它必须实现两个接口而不是允许选项你有一个完整的班级。

因此,您在 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

所以继承接口实际上只是强制实现派生接口的类也必须实现基接口的一种方式。

于 2013-06-20T22:02:48.880 回答
2

我不知道这是否是错字,但您有两种不同的方法:一种不带参数,另一种带对象,因此编译器要求是合法的。

如果这是一个错字并且您只有一个方法,例如“ 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
于 2013-06-20T22:05:22.633 回答