2011-05-26 20 views
9

मैं जावा में एक अमूर्त वर्ग में फ़ैक्टरी विधि लिखने की कोशिश कर रहा हूं (इसलिए मैं इसे सुपर-क्लास की बजाय विस्तारित कक्षा का एक नया उदाहरण वापस करना चाहता हूं)।जावा का 'स्वयं' कीवर्ड

PHP में मैं इस self कीवर्ड का उपयोग करना चाहते हैं:

abstract class Superclass { 
    public static function factory($arg) { 
     return new self($arg); 
    } 

    private function __construct($arg) {} 

    abstract public function doSomething() {} 
} 

करता जावा self जैसा कोई कीवर्ड मैं इस के लिए उपयोग कर सकते हैं?

उत्तर

8

नहीं; जावा में, स्थैतिक विधियों को उसी तरह विरासत में नहीं मिला है जैसे गैर स्थैतिक विधियां हैं। एक उप-वर्ग में इसके सुपरक्लास की स्थैतिक विधियां होंगी, लेकिन जब वे निष्पादित होंगी, तो वे सुपरक्लास के संदर्भ में निष्पादित करेंगे - इसलिए कोई कीवर्ड नहीं है जिसका उपयोग यह पता लगाने के लिए किया जा सकता है कि किस वर्ग को विधि के माध्यम से बुलाया गया था।

संपादित करें: एक और सटीक फॉर्मूलेशन यह है कि स्थैतिक तरीकों को विरासत में नहीं मिला है; हालांकि, भाषा हमें स्थिर विधि Superclass.foo() पर कॉल करने के लिए Subclass.foo() का उपयोग करने की अनुमति देती है।

जो आप प्राप्त करना चाहते हैं उसके आधार पर, आप Abstract Factory pattern को लागू करना चाहते हैं। यह लगभग इस तरह जाता है:

public abstract class Superclass {} 
public class SubclassA extends Superclass {} 
public class SubclassB extends Superclass {} 

public abstract class AbstractFactory { 
    public abstract Superclass Create(); 
} 

public class FactoryA extends AbstractFactory { 
    public Superclass Create() { 
     return new SubclassA(); 
    } 
} 

public class FactoryB extends AbstractFactory { 
    public Superclass Create() { 
     return new SubclassB(); 
    } 
} 

अब, आप उदा। एक ऐसी विधि बनाएं जो AbstractFactory लेती है (जो वास्तव में, FactoryA या FactoryB होगी)। इस ऑब्जेक्ट पर Create() पर कॉल करने से SubclassA या SubclassB उत्पन्न होगा।

संपादित करें: निश्चित संकलन त्रुटि (कारखानों को AbstractFactory का विस्तार करने के लिए भूल गए)।

+0

@Ross: शायद - आपको कौन से संदर्भों में उदाहरण बनाने की आवश्यकता है (आपको केवल उप-वर्ग कन्स्ट्रक्टर का उपयोग करने के बजाय उस विधि की आवश्यकता क्यों है)? क्या आपको कभी भी बिना किसी जानकारी के उदाहरण बनाने की आवश्यकता है कि आपको किस प्रकार की कक्षा की आवश्यकता होगी? यदि ऐसा है, तो सार फैक्टरी पैटर्न के बारे में कोड नमूने के लिए अद्यतन देखें; अन्यथा, वह पैटर्न शायद अधिक से अधिक रास्ता है। :-) –

+0

मुझे समझ में आया कि पूरा बिंदु चीज गतिशील बनाना है। – vbence

+0

@tada: कृपया समझाएं; मैंने खुद से विरोधाभास कहाँ किया? (मैंने सार फैक्ट्री पैटर्न का सुझाव दिया क्योंकि मैंने यही सोचा था कि वह हासिल करना चाहता था, लेकिन फिर मुझे एहसास हुआ कि शायद उसके पास कुछ और इरादा था, इसलिए मैं बस यह स्पष्ट करना चाहता था कि यह पैटर्न केवल कुछ स्थितियों में उपयोगी है या आप हैं कुछ और के बारे में सोच रहे हो?) –

0

मुझे नहीं लगता कि जावा में "वर्तमान" उपclass का नाम ढूंढना संभव है। और विशेष रूप से कुछ गतिशील वस्तु उत्पादन संभव नहीं होगा।

तो आपको इसके बजाय प्रत्येक सबक्लास में उस स्थिर कार्य को परिभाषित करने की आवश्यकता होगी।

2

आपको इसे प्राप्त करने के लिए कुछ हैक्स की आवश्यकता है। एक तरह से मैं के बारे में सोच सकते हैं कि यह प्राप्त करने के लिए है: एक nullary निर्माता के लिए

Class cls = new Object() { }.getClass().getEnclosingClass(); 
Object instance = cls.newInstance(); 

आपका वर्ग की जरूरत:

public static <T extends SuperClass> T factory(Class<T> clazz) { 
    return clazz.newInstance(); 
} 
3

आप पूरी तरह करना है, तो आप एक स्थिर संदर्भ के लिए इस कोड का उपयोग कर सकते ।

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