2010-07-04 4 views
26

इस कोड को दिए गए एक ओवरराइड निरंतर उपयोग कैसे करें:एक inheritanced वर्ग

class A 
    CONST = 'A' 

    def initialize 
    puts CONST 
    end 
end 

class B < A 
    CONST = 'B' 
end 

A.new # => 'A' 
B.new # => 'A' 

मैं CONST = 'B' परिभाषा का उपयोग करने के B चाहते हैं, लेकिन मैं कैसे पता नहीं है। कोई विचार?

अभिवादन

टॉम

उत्तर

69
class A 
    CONST = 'A' 

    def initialize 
    puts self.class::CONST 
    end 
end 

class B < A 
    CONST = 'B' 
end 

A.new # => 'A' 
B.new # => 'B' 
+0

बिल्कुल सही, बहुत बहुत धन्यवाद! – Tom

+0

तो ... इसका मतलब है कि कक्षा ए में हर जगह बदलने के बिना इसे करने का कोई तरीका नहीं है जो CONST का उपयोग करता है? – nohat

+2

हां। लगातार लुकअप आमतौर पर संकलन समय पर बंधे होते हैं। –

0

मैं Konstantin हासे द्वारा समाधान के साथ कुछ मुद्दों था। विरासत वर्ग की तत्काल वस्तु में स्थिरता तक पहुंचने पर, पैरेंट निरंतर उपयोग किया जाता था।

मुझे स्पष्ट रूप से कक्षा का संदर्भ देना पड़ा।

self.class::CONST 

चियर्स

+2

यह उनके उत्तर से अलग कैसे है? – akostadinov

0

मामले में किसी को भी इस पाता है और मॉड्यूल एक्सटेंशन का उपयोग कर के बजाय, बस का उपयोग

self::CONST

1

खेद है कि मैं एक 'टिप्पणी में कोड काम करने के लिए स्वरूपण नहीं मिल सका 'केवल' उत्तर 'में है, लेकिन यह हेन्ड्रिक को अकोस्टैडिनोव के प्रश्न के जवाब में है "यह उनके [कॉन्स्टेंटिन के] जवाब से अलग कैसे है?"

मुझे लगता है कि हैंड्रिक अपनी विरासत कक्षा & में विधियों से निरंतर पहुंचने का प्रयास कर रहा था जो कि यह एक उदाहरण या स्थैतिक विधि पर निर्भर करता है। ऐसा लगता है कि आप एक उदाहरण विधि में अपेक्षा करते हैं। लेकिन हो सकता है कि शायद आप एक स्थिर विधि के लिए कैसे उम्मीद करेंगे। यहां तक ​​कि अगर क्या नहीं हेंड्रिक मतलब है कि, इस ध्यान देने योग्य हो सकता है:

आप Konstantin के रूप में सटीक वर्ग परिभाषाओं है, लेकिन आप इस तरह वर्ग एक के लिए एक विधि जोड़ते हैं:

def self.print_const 
    puts CONST 
end 

तो फिर तुम एक मिल दोनों बार:

A.print_const # prints A 
B.print_const # prints A 

लेकिन यदि आप वर्ग को संदर्भित द्वारा एक में विधि को परिभाषित:

def self.print_const 
    puts self::CONST 
end 

फिर आप प्राप्त करते हैं:

A.print_const # prints A 
B.print_const # prints B 
संबंधित मुद्दे