D语言中使用extern(Windows)类重载Object方法时的问题

       使用D语言已经有快20天了,已经完成项目需要的基本功能,但还需进一步完善。

       最近两三天在DGUI基础上移植了几个Window窗口控件,有TreeList(树+列表视图),DataList(数据列表),MdiFrom(多窗口),IEWebBrowser(IE浏览器),SciEditor(Sci源代码编辑器),DockPanel(notpad的Docking插件),SysHeader(表头控件),

SysLink等几个标准Windows控件。

       感谢DGUI的作者,对Windows控件做的布局管理及封装,真是特别的优秀。

       在使用Windows接口时发现一个无法重载的问题. 代码如下:

import std.stdio;
import core.sys.windows.unknwn;
import core.sys.windows.windows;
class MyClass : IUnknown{
    HRESULT QueryInterface(IID* riid, void** pvObject){return 0;}
    ULONG AddRef(){return 0;}
    ULONG Release(){return 0;}
    override int opCmp(Object o) {
        return super.opCmp(o);
    }
}
int main(string[] argv){
    MyClass my = new MyClass();
    return 0;
}

      编译时出错错误:

image

错误    1    Error: function main.MyClass.opCmp does not override any function, did you mean to override 'object.Object.opCmp'?    D:\temp\ConsoleApp8\ConsoleApp8\main.d    11   

       提示无法重载。

       这是因为当MyClass从IUnknown接口继承后,因为IUnknown为extern(Windows)类型,所以MyClass也为extern(Windows)类型,这时候override int opCmp(Object o)因为符号使用extern(Windows)格式,而无法与Object.opComp方法对应上,从而无法重载。导致编译失败。

       解决这个问题,只需要明确指定opComp方法为extern(D)类型就可以了。如下:

import std.stdio;
import core.sys.windows.unknwn;
import core.sys.windows.windows;
class MyClass : IUnknown{
    HRESULT QueryInterface(IID* riid, void** pvObject){return 0;}
    ULONG AddRef(){return 0;}
    ULONG Release(){return 0;}
    extern(D) override int opCmp(Object o) {
        return super.opCmp(o);
    }
}
int main(string[] argv){
    MyClass my = new MyClass();
    return 0;
}

         -------------------------------------------------------------------------------------------------------------------

        另外一个需要思考的问题是,D语言中是不能调用C++中的构造函数,要实现可能需要分析C++中的new函数实现C++中的类在D语言中的构造 。

 

作者:宛宏南

posted @ 2016-08-26 14:09  honan  阅读(310)  评论(0编辑  收藏  举报