【问题标题】:How to get classinfo of object declared as an interface type如何获取声明为接口类型的对象的类信息
【发布时间】:2015-07-22 13:04:13
【问题描述】:

我有一些接口类型的列表。为了调试,我想打印出列表中每个对象的底层类的名称:

import std.stdio, std.container;

interface IFace { }

class Foo : IFace { }
class Bar : IFace { }

unittest {
  SList!IFace list;
  list.insert(new Foo);
  list.insert(new Bar);

  foreach(obj ; list) writeln(obj.classinfo.name);
}

我期待

酒吧

但是得到了

有没有办法在运行时从接口类型变量中提取实现类?

此外,如果IFaceclass 而不是interface,我确实会得到预期的结果。为什么?

【问题讨论】:

    标签: types d


    【解决方案1】:

    将接口转换为Object,然后获取typeid或classinfo:

    foreach(obj ; list) writeln((cast(Object)obj).classinfo.name); 
    

    应该还检查强制转换中的 null 是否完全正确,也许可以创建一个辅助函数来执行此操作,但如果您确定所有接口都来自 Object,那么您将可以调试了。

    需要这样做的原因是 D 接口不一定代表 D 对象,因此类名实际上可能不可用。例如,它可能是在某个外部 DLL 中创建并通过接口访问的 COM 对象。它可能是 D 正在与之交谈的 C++ 类。或者更多,接口保持通用,因此它们可以作为通用的......嗯,用各种语言和样式编写的各种组件之间的接口。

    这也是对 Object 的强制转换可能返回 null 的原因:如果它是 C++ 类,它将无法转换回 D Object

    此外,如果 IFace 是一个类而不是一个接口,我会得到预期的结果。为什么?

    一个类保证有一个 D 对象基础,其中包含可用的运行时类型信息,所以它只在那里工作。接口可以来自其他来源。

    【讨论】:

    • 这回答了我所问的问题,还有一些我从未想过要问的问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 2017-05-28
    • 2013-10-12
    相关资源
    最近更新 更多