2011-06-22 14 views
6

में कक्षा का नाम देता है, कहें, कक्षा ए 1, ए 2, ..., सभी एक सार वर्ग बी बढ़ाता है मैं ए 1, ..., एक ऐसा कार्य करने के लिए जो एक स्ट्रिंग देता है कक्षा का नाम। यह निश्चित रूप से संकलन समय में जाना जाता है, लेकिन मैं इस फ़ंक्शन को बी में कार्यान्वित करना चाहता हूं, और विरासत का उपयोग करें ताकि सभी Ai: को यह कार्यक्षमता मिल सके।फ़ंक्शन जो डी

जावा में, यह आसानी से किया जा सकता है, बी की अनुमति से विधि

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

अधिक या कम है। तो, मैं डी में यह कैसे करूँ? साथ ही, यह निर्धारित करने के लिए कि कौन से वर्ग के सदस्य सार्वजनिक हैं, लक्षण या समान का उपयोग करके कोई तरीका है?

उत्तर

4

बस typeof(this).stringof

लेकिन इस संकलन समय पर तय हो गई है तो विरासत मूल्य

this.typeinfo.name 

परिवर्तन नहीं करता है उदाहरण के classname के गतिशील नाम दे देंगे

http://www.d-programming-language.org/expression.html#typeidexpression
http://www.d-programming-language.org/phobos/object.html#TypeInfo_Class

+0

यह.classinfo.name वापस करें; मेरे लिए काम किया –

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 का उपयोग करके सभी सदस्यों को फिर से सक्रिय कर सकते हैं।

foreach (member; __traits(allMembers, MyClass)) 
    writeln(member); 
संबंधित मुद्दे