2011-06-22 7 views
6

クラスA1、A2、...、すべてが抽象クラスBを継承します。 A1、...、Anには、クラス名。 これはコンパイル時には確かに分かっていますが、この関数を Bに実装し、すべてのAi:がこの機能を取得できるように継承を使用したいと思います。 Javaで クラス名をDに返す関数

が、これは容易方法

String getName() { 
    return this.getClass(); 
} 

多かれ少なかれを有するBをさせることにより、行うことができます。だから、私はDでこれをどうやってやるの?また、どのようなクラスメンバーが公開されているかを判断するために、特性などを使って方法がありますか?

答えて

3

コンパイル時には知られていますが、実行時にクラス名を評価するにはデマングルが必要です。

ランタイム評価が大丈夫であればここにある:

import std.stdio; 
import std.algorithm; 

abstract class B { 
    string className() @property { 
     return this.classinfo.name.findSplit(".")[2]; 
    } 
} 

class A1 : B { } 
class A2 : B { } 

void main() 
{ 
    auto a1 = new A1(); 
    writeln(a1.className); 

    auto a2 = new A2(); 
    writeln(a2.className); 
} 
3

あなたは単にClassName.stringofを使用して、クラスの名前を取得することができます。

あなたは仮想関数としてそれをしたい場合は、私がCuriously Recurring Template Patternを使用することをお勧めします:

class B 
{ 
    abstract string getName(); 
} 

class BImpl(T) 
{ 
    string getName() { return T.stringof; } 
} 

class A1 : BImpl!A1 { ... } 
class A2 : BImpl!A2 { ... } 
/+ etc. +/ 

は残念ながら、現時点ではメンバーが公開されているクラスを判別する方法はありません。 allMembers traitを使用して、すべてのメンバーを反復することができます。しかし、これはそう継承値

this.typeinfo.name 

インスタンス

のクラス名の動的な名前を与える変化しないコンパイル時に固定されている

foreach (member; __traits(allMembers, MyClass)) 
    writeln(member); 
関連する問題