我不知道这里发生了什么。请解释。代码...
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/
答案 0 :(得分:5)
D中的指针不是多态的。只有类引用。只要你通过指针操作,就会失去多态性。
此外,&ss2
不会产生指向类的指针。它导致指向类的引用。您不能在D中指向类对象,只能引用类对象。类型系统并没有真正区分类引用和它引用的对象,这就是为什么要对const类对象进行非const引用时需要std.typecons.Rebindable
的原因。
但是如果您出于某种原因确实需要使用void*
,则可以<{1}}投射一个类引用 - 尽管您确实应该避免使用它。使用void*
意味着您丢失了类型信息,编译器无法保护您。虽然它偶尔会有用(特别是在与C交互时),但在D中使用void*
的理由并不多。