首页 > 代码库 > D语言中使用extern(Windows)类重载Object方法时的问题
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;}
编译时出错错误:
错误 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语言中的构造 。
作者:宛宏南
D语言中使用extern(Windows)类重载Object方法时的问题