2013-04-10 47 views
1

我不知道這裏發生了什麼。請解釋。代碼...無法將接口作爲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(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 

這是怎麼回事與最終輸出?我將一個類實例傳遞給一個需要指針的函數。然後當我把它作爲一個接口來使用時,它並不尊重接口的方法。但是,有些如何能夠告訴我這是我通過的課程的一個實例?我不得不使用void *作爲參數類型。所以請不要使用它。

編輯:編譯信息...

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

回答

5

指針在d不是多態。只有類引用是。只要通過指針操作,就會失去多態性。

而且,&ss2不會產生指向類的指針。它會導致指向類的引用。 D中不能有類對象的指針,只能引用類對象。類型系統並沒有真正區分類引用和它引用的對象,這就是爲什麼std.typecons.Rebindable是必需的,如果您想要對const類對象進行非const引用。

可以但是投類引用,並從void*如果你真的需要使用void*出於某種原因 - 儘管你真的應該避免一般。使用void*意味着你失去了類型信息,編譯器無法保護你。雖然偶爾有用(特別是與C交互時),但在D中使用void*沒有多少理由。