2011-06-22 19 views
6

olarak döndüren işlev Say, A1, A2, ... sınıfları, Bir tümü, B sınıfı özetini genişletir. A1, ..., An dizisini döndüren bir işlevi kullanmak istiyorum sınıf adı. Bu kesinlikle derleme zamanında bilinir, ancak bu işlevi B içinde uygulamak ve tüm Ai: s'nin bu işlevi alması için devralmayı kullanmak istiyorum. Java Sınıf adını D

, bu kolayca yöntem

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

daha fazla veya daha az olması B izin vererek, yapılabilir. Peki bunu D'de nasıl yapabilirim? Ayrıca, hangi sınıf üyelerinin kamuya açık olduğunu belirlemek için özellikleri veya benzerlerini kullanma yolu var mı?

cevap

3

Derleme zamanında bilinir, ancak çalışma zamanında sınıf adını değerlendirmek demangling gerektirir, bence.

Burada çalışma zamanı değerlendirme tamam olup olmadığını geçerli:

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

Sadece ClassName.stringof kullanarak bir sınıfın adını alabilirsiniz. Sanal bir fonksiyonu olarak isterseniz

sonra Curiously Recurring Template Pattern kullanarak öneriyoruz:

class B 
{ 
    abstract string getName(); 
} 

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

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

Maalesef şu anda üye kamu hangi sınıf belirlemek için hiçbir yolu yoktur. Tüm üyeleri allMembers trait kullanarak yineleyebilirsiniz.

foreach (member; __traits(allMembers, MyClass)) 
    writeln(member); 
İlgili konular