无法在D语言中将接口作为指针传递

Jac*_*lch 1 d interface

我不知道这里发生了什么.请解释.码...

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

输出...

First Class
Some Class
Some Class
Some Class
Some Class
Final Class
Final Class
main.ClassObject
Run Code Online (Sandbox Code Playgroud)

最后的输出是怎么回事?我将一个类实例传递给一个需要指针的函数.然后,当我将其作为接口进行转换时,它不尊重接口的方法.但有些人怎么能告诉我这个班的实例呢?

遗憾的是我绑定到C库所以我必须使用void*作为参数类型.所以请不要建议不要使用它.

编辑:编译器信息......

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

Jon*_*vis 5

D中的指针不是多态的.只有类引用.只要你通过指针操作,就会失去多态性.

此外,&ss2不会导致指向类的指针.它导致指向类的引用.您不能在D中指向类对象,只能引用类对象.类型系统并没有真正区分类引用和它引用的对象,这就是为什么std.typecons.Rebindable需要对const类对象进行非const引用的原因.

可以但是投类引用,并从void*,如果你真的需要使用void*某种原因-尽管你真的应该避免一般.使用void*意味着您丢失了类型信息,编译器无法保护您.虽然它偶尔有用(特别是在与C交互时),但没有太多理由void*在D中使用.