Interface 无法以D语言中的指针形式传递接口

Interface 无法以D语言中的指针形式传递接口,interface,d,Interface,D,我不知道这里发生了什么。请解释一下。代码 import std.stdio; void main(string[] args) { ClassObject ss1 = new ClassObject("First Class"); writeln(ss1.produce()); ClassObject ss2 = new ClassObject("Some Class"); ClassObject* ss3 = &ss2; voidclass(s

我不知道这里发生了什么。请解释一下。代码

import std.stdio;

void main(string[] args)
{
    ClassObject ss1 = new ClassObject("First Class");
    writeln(ss1.produce());
    ClassObject ss2 = new ClassObject("Some Class");
    ClassObject* ss3 = &ss2;
    voidclass(ss3);
    ClassObject ss4 = new ClassObject("Final Class");
    passinterface(ss4);
    ClassObject* ss5 = &ss4;
    writeln(ss5.produce());
    voidinterface(ss5);
}

public void voidclass(void* arg)
{
    ClassObject* ss = cast(ClassObject*) arg;
    writeln(ss.produce());
    writeln(ss.produce);
    ClassObject ssnp = *ss;
    writeln(ssnp.produce());
    writeln(ssnp.produce);
}

public void voidinterface(void* arg)
{
    IObject* bob = cast(IObject*) arg;
    writeln(bob.produce());
}

public void passinterface(IObject arg)
{
    writeln(arg.produce());
}

interface IObject
{
    string produce();
}

class ClassObject : IObject
{
    protected string _value;

    this(string value)
    {
        this._value = value;
    }

    public string produce()
    {
        return this._value;
    }
}
输出

First Class
Some Class
Some Class
Some Class
Some Class
Final Class
Final Class
main.ClassObject
最终的结果是什么?我将类实例传递给需要指针的函数。然后,当我将其转换为接口时,它不尊重接口的方法。但是有些人怎么能告诉我这个类的一个实例呢

不幸的是,我绑定到一个C库,所以我不得不使用void*作为参数类型。所以请不要建议不要使用它

编辑:编译器信息

$ dmd -v
DMD64 D Compiler v2.062
Copyright (c) 1999-2012 by Digital Mars written by Walter Bright
Documentation: http://dlang.org/

D中的指针不是多态的。仅支持类引用。一旦通过指针进行操作,就会丢失多态性

另外,&ss2不会产生指向类的指针。它导致指向类的引用的指针。在D中不能有指向类对象的指针,只能有对类对象的引用。类型系统并没有真正区分类引用和它引用的对象,这就是为什么如果您想要对常量类对象进行非常量引用,就需要使用类型系统


但是,如果出于某种原因确实需要使用void*,您可以向void*和从void*强制转换类引用,尽管通常您确实应该避免使用void*。使用void*意味着您将丢失类型信息,编译器无法保护您。虽然它偶尔会很有用,特别是在与C交互时,但没有太多理由在D中使用void*。

D中的指针不是多态的。仅支持类引用。一旦通过指针进行操作,就会丢失多态性

另外,&ss2不会产生指向类的指针。它导致指向类的引用的指针。在D中不能有指向类对象的指针,只能有对类对象的引用。类型系统并没有真正区分类引用和它引用的对象,这就是为什么如果您想要对常量类对象进行非常量引用,就需要使用类型系统

但是,如果出于某种原因确实需要使用void*,您可以向void*和从void*强制转换类引用,尽管通常您确实应该避免使用void*。使用void*意味着您将丢失类型信息,编译器无法保护您。虽然它偶尔会有用,特别是在与C交互时,但在D中使用void*并没有太多理由