2011-06-22 7 views
6

Digamos, clases A1, A2, ..., An todo amplía la clase abstracta B. Me gustaría que A1, ..., An tenga una función que devuelve una cadena del nombre de la clase. Esto es ciertamente conocido en tiempo de compilación, pero me gustaría implementar esta función en B, y usar herencia para que todas las Ai: s obtengan esta funcionalidad.Función que devuelve el nombre de clase en D

en Java, esto se puede hacer fácilmente, permitiendo que B tiene el método

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

más o menos. Entonces, ¿cómo hago esto en D? Además, ¿hay alguna manera, usando rasgos o similar, de determinar qué miembros de la clase son públicos?

Respuesta

3

Se conoce en tiempo de compilación, pero la evaluación del nombre de clase en tiempo de ejecución requiere demanda, creo.

Aquí es decir, si el tiempo de ejecución-evaluación está bien:

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

Usted puede obtener el nombre de una clase simplemente mediante el uso ClassName.stringof.

Si desea como una función virtual, entonces te recomiendo usar el 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. +/ 

Desafortunadamente, en este momento no hay manera de determinar qué miembros de la clase son públicos. Puede iterar a todos los miembros usando el allMembers trait.

foreach (member; __traits(allMembers, MyClass)) 
    writeln(member); 
Cuestiones relacionadas