2012-02-01 5 views
10

मुझे जावा में निम्न समस्या है: मेरे पास बेस क्लास और व्युत्पन्न कक्षा है और मेरे पास बेस क्लास में एक विधि है। जब मैं व्युत्पन्न के माध्यम से बेस की फू विधि को कॉल करता हूं तो मैं व्युत्पन्न वर्ग प्राप्त करना चाहता हूं। फू विधि सामान्य हो सकती है अगर इसे इस तरह से किया जा सकता है।जावा: एक स्थिर विधि से विरासत वर्ग की कक्षा प्राप्त करें

class Base 
{ 
    static void foo() 
    { 
     // I want to get Derived class here 
     // Derived.class 
    } 
} 

class Derived extends Base 
{ 
} 

Derived.foo(); 

आपकी मदद के लिए धन्यवाद!

डेविड

+0

मुझे यकीन नहीं है कि यह बिल्कुल करने योग्य है, न कि स्थिर तरीके से जिस तरह से आपने इसे किया है। –

+2

"मैं व्युत्पन्न वर्ग प्राप्त करना चाहता हूं" जो ऐसा करने के लिए एक अजीब बात है। किस कारण से? आपकी वास्तविक समस्या को हल करने का एक बेहतर तरीका हो सकता है – Raedwald

+0

मेरे पास ActiveModel नामक एक मॉडल है, और मैं इसे रेल इंटरफ़ेस की तरह चाहता हूं, पूर्व: सूची ब्रांड = Brand.all(); और ब्रांड ActiveModel से फैला हुआ है (ActiveModel में सभी फ़ंक्शन हैं), अभी मुझे अपने फ़ोरस के लिए यूआरएल उत्पन्न करने में सक्षम होने के लिए सभी फ़ंक्शन में Brand.class पास करना होगा उदाहरण के लिए: http: //localhost/brands.json मेरा उद्देश्य सूची ब्रांडों से ब्रांड.क्लास को हटाने के लिए = ब्रांड.ल (ब्रांड.क्लास) – seriakillaz

उत्तर

4

यह तरीका नहीं है कि स्थिर तरीके काम करते हैं। आपको Derived.foo() को लागू करना होगा, जो कुछ भी है वह Derived पर विशेष है, और उस विधि को Base.foo() पर कॉल करें। यदि आपको वास्तव में प्रकार की जानकारी की आवश्यकता है, तो आप Base.foo0(Class klass) बना सकते हैं।

लेकिन ईमानदार होने के लिए, किसी भी स्थैतिक विधि को यह जानने की जरूरत है कि उस वर्ग के प्रकार को जिस पर लागू किया गया है, शायद एक उदाहरण विधि होनी चाहिए।

+0

हाँ, वास्तव में इस तरह मैंने इस समस्या के आसपास पहले काम किया था – seriakillaz

0

संभव नहीं है, Derived.foo() बस Base.foo() के लिए कोड दे देगा।

3

खैर, Derived.foo() के फोन करने वाले को जानता है कि वे क्या, बुला रहे हैं, ताकि आप अपने तरीकों इस प्रकार बदल सकता है:

class Base 
{ 
    static void foo(Class<T> calledBy) 
    { 
     // I want to get Derived class here 
     // Derived.class 
    } 
} 

class Derived extends Base 
{ 
} 

Derived.foo(Derived.class); 
1

static तरीकों inheritated नहीं कर रहे हैं। एक ही हस्ताक्षर के साथ स्टेटिक विधियां केवल सुपरक्लास में समान विधियों को छुपा सकती हैं। इसका मतलब है कि आप कभी भी नतीजे नहीं देख पाएंगे - आप हमेशा संलग्न वर्ग को बिल्कुल जानते हैं। यह कभी भी संभव नहीं है कि स्थिर विधि किसी अन्य वर्ग के भीतर "भीतर" है। इसलिए वांछित परिणाम उत्पन्न करना असंभव है। सबक्लास या इंस्टेंस से एक स्थिर विधि को कॉल करना इस कारण से एक बुरा विचार है क्योंकि यह केवल वास्तविक वर्ग को छुपाता है। (IDEs और स्थिर कोड विश्लेषण उपकरण निशान, या इसे सुधारने कर सकते हैं।)

सूत्रों का कहना है:

तो क्या विरासत में मिला तरीकों के साथ काम करता है static तरीकों के साथ काम नहीं करता है जो विरासत में नहीं हैं।

class Base { 
    static void foo() { 
     // Only the static context is available here so you can't get class dynamic class information 
    } 
    void bar() { 
     System.out.println(getClass()); 
    } 
} 
class Derived extends Base { 
} 
class Another extends Base { 
    static void foo() { 
     // No super call possible! 
     // This method hides the static method in the super class, it does not override it. 
    } 
    void bar() { 
     super.bar(); 
    } 
} 

Derived derived = new Derived(); 
derived.bar(); // "class Derived" 
Base base = new Base(); 
base.bar(); // "class Base" 

// These are only "shortcuts" for Base.foo() that all work... 
derived.foo(); // non-static context 
Derived.foo(); // could be hidden by a method with same signature in Derived 
base.foo(); // non-static context 

Base.foo(); // Correct way to call the method 

Another a = new Another(); 
a.foo(); // non-static context 
Another.foo(); 

क्या यह अच्छा विचार है कि भाषा इसकी अनुमति देती है? - एचएम। मुझे लगता है कि यह कह रहा है कि आईडीई और कोड विश्लेषण उपकरण चेतावनी देते हैं और इसे स्वचालित रूप से भी सही कर सकते हैं।

-1
Derived.foo(); 

यह अगर एक वहाँ परिभाषित किया गया है, fooDerived में परिभाषित करने के लिए जाना होगा:

class Base { 
    static void foo() { 
    System.out.println("Base"); 
    } 
} 

class Der extends Base { 
    static void foo() { 
    System.out.println("Der"); 
    } 
} 

class Check { 
    public static void main(String[] args) { 
    Base.foo(); 
    Der.foo(); 
    } 
} 

जब मैं इसे चलाने:

javac -g Check.java && java Check 
Base 
Der 

तो आपके सवाल का क्या है? यदि आपको प्रत्येक व्युत्पन्न कक्षा implement foo की आवश्यकता है जो जावा में लागू करना संभव नहीं है।

+0

सवाल यह था: 'Derived.foo' नहीं था लेकिन फिर भी 'व्युत्पन्न' को 'foo' में वर्गनाम के रूप में प्राप्त करें, जैसे गैर स्थैतिक तरीकों में। –

+0

क्या आप एक उदाहरण दे सकते हैं? मुझे ऐसा नहीं लगता ... –

+0

मुझे? क्षमा करें, मुझे नहीं लगता कि मुझे आपका प्रश्न मिल गया है। प्रश्न में उदाहरण दिखाता है कि ओपी क्या चाहता है, लेकिन यह असंभव है। –

संबंधित मुद्दे