【问题标题】:Problem overriding methods in VB.NET (Error BC30284)VB.NET 中覆盖方法的问题(错误 BC30284)
【发布时间】:2009-05-13 10:30:40
【问题描述】:

我的基类中有一个可覆盖的子类

Project1:
Public Class BaseClass
    Protected Overridable Sub MySub(ByVal Parameter as MyType)
End Class

Project2:
Public Class DerivedClass
    Inherits BaseClass
    Protected Overrides Sub MySub(ByVal Parameter as MyType)
End Class

MyType 是来自外部 COM 库的类型。当我试图在派生类中覆盖它时,我得到了

error BC30284: sub 'MySub' cannot be declared 'Overrides' because it does not override a function in a base class

我已将所需的 COM 引用添加到包含基类和派生类的项目中。 知道如何摆脱这个错误吗?我正在使用 VS2005 和 .NET 2.0

编辑:所有其他覆盖都工作正常,如果我使用引用的 COM 类型作为参数,我只会收到错误。如果我将 Parameter 更改为 Object,则覆盖效果很好。

【问题讨论】:

  • 您能否编辑您的帖子以包含您的基类和子类的定义?
  • 是后派生类签名和派生类中覆盖子的签名。

标签: vb.net inheritance com


【解决方案1】:

您是否考虑或尝试过使用TlbImp.exe 从 COM 类型库生成静态 DLL,并从两个项目中引用它(而不是使用 COM 引用)以确保它们引用完全相同的东西? TlbImp 包含在 Visual Studio 中,但我在只安装了 Visual Studio Express 的系统上找不到它,所以如果你使用 express,你可能不得不去寻找它(链接的页面可能有也可能没有你想要的版本)。我怀疑如果每个项目都有自己的 COM 引用,Visual Studio 可能会为每个项目创建一个单独的 COM 包装器,并且生成的 COM 包装器在生成的 GUID 等方面可能并不完全一致。因此,通过创建并强制使用单个包装器,您也许可以将其作为可能的问题消除。

【讨论】:

    【解决方案2】:

    除了使用 TlbImp 之外,另一种选择是创建一个单独的项目,您可以在其中将 MyType 封装在一个 .NET 类中,并将该项目包含在您的两个示例中。

    因此,您最终会得到一个中间 MyDotNetType,它将作为构造函数参数 Mytype(COM 对象)并将其作为只读属性公开。 然后 MySub 调用会将 MyDotNetType 作为参数。

    亲切的问候

    诺埃尔

    【讨论】:

      【解决方案3】:

      请检查基类和派生类中函数的签名,如果您有不同的参数或数据类型或任何参数不匹配。然后你会得到这种类型的错误。简单请检查函数名、参数名和数据类型。它对我有用。我希望这个答案会有所帮助。

      谢谢, 瑞木V

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多