如何让类库引用另一仅包含接口的类库并正确实现其定义的接口
问题解决方法
报错根因
你遇到的Type Imaths is not defined报错由两个问题共同导致:
IMaths是InterfaceHolder类的嵌套类型,你引用时没有带上外层类的路径InterfaceHolder类和内部的IMaths接口都没有加Public修饰符,VB.NET中顶层类型默认访问修饰符为Friend,仅允许同一程序集内访问,跨项目引用时无法识别。
正确创建包含接口的类库
不需要把接口嵌套在类内部,直接在类库的根命名空间下定义公共接口即可,修改MyInterface项目的代码如下:
' MyInterface项目下的代码,无需嵌套类 Public Interface IMaths Function ADD(ByVal a As Integer, ByVal b As Integer) As Integer End Interface
如果确实需要嵌套在InterfaceHolder类中,必须同时给外层类和接口添加Public修饰符:
Public Class InterfaceHolder Public Interface IMaths Function ADD(ByVal a As Integer, ByVal b As Integer) As Integer End Interface End Class
修改完成后重新生成MyInterface项目,确保被引用的是最新生成的dll文件。
跨项目实现接口的方法
接口本身就是类型定义,不需要创建任何对象即可直接实现:
- 如果是直接在命名空间下定义的
IMaths,直接用原有写法即可:
' MyMathsLibrary项目代码 Imports MyInterface ' 顶部加这行可以省略命名空间前缀 Public Class MathOperations Implements IMaths ' 加了Imports后可以直接写接口名,否则写MyInterface.IMaths Public Function ADD(a As Integer, b As Integer) As Integer Implements IMaths.ADD Return a + b End Function End Class
- 如果是嵌套在
InterfaceHolder类中的接口,引用时需要带上外层类路径:
Implements MyInterface.InterfaceHolder.IMaths
接口不能声明为Shared的处理方案
接口本身的设计定位是实例行为的契约,天生不支持Shared修饰符,如果你需要调用方无需实例化实现类即可调用方法,可以在实现类中同时提供静态访问入口:
Public Class MathOperations Implements MyInterface.IMaths ' 实现接口约定的实例方法 Public Function ADD(a As Integer, b As Integer) As Integer Implements MyInterface.IMaths.ADD Return a + b End Function ' 额外提供静态方法,无需实例化即可调用 Public Shared Function ADD(a As Integer, b As Integer) As Integer Return a + b End Function End Class
调用时直接用MathOperations.ADD(1,2)即可,不需要创建MathOperations的实例。
内容的提问来源于stack exchange,提问作者Sougata
相关产品推荐
相关产品推荐

