2010-12-29 11 views
5

के लिए टाइप एरर के साथ समस्या को कैसे दूर करें I C# और C++ में कुछ प्रोजेक्ट के बाद जावा के साथ काम करना शुरू कर रहा हूं।विज़िटर कार्यान्वयन

मैं इस तरह आगंतुक इंटरफेस डिजाइन करने के लिए चाहता था:

public interface ActionVisitor<A> { 
    void visitAction(A action);  
} 

public interface MySmallActionVisitor 
extends ActionVisitor<ActionA>, 
    ActionVisitor<ActionB> 
{ 

} 

public interface MyFullActionVisitor 
extends ActionVisitor<ActionA>, 
    ActionVisitor<ActionB>,ActionVisitor<ActionC>,ActionVisitor<ActionD> //.... 
{ 

} 

बेशक इस प्रकार के विलोपन की वजह से काम नहीं करता। (कारण है कि मैं कुछ इस तरह चाहते हैं कि मैं क्रिया के विभिन्न समूहों का दौरा किया जा सकता है के लिए अलग अलग आगंतुक इंटरफेस होगा।)

एकमात्र समाधान है कि मेरे दिमाग में आता है इंटरफेस

public interface ActionAVisitor { 
     void visitAction(ActionA action);  
    } 
public interface ActionBVisitor { 
     void visitAction(ActionB action);  
    } 
//... 
घोषित करने के लिए है

और फिर

public interface MySmallActionVisitor 
extends ActionAVisitor, ActionBVisitor 
{ 

} 

यह काम करेगा, लेकिन मैं सभी ActionXVisitor-इंटरफेस की घोषणा जो बेवकूफ पुनरावृत्ति और फ़ाइलों के बहुत सारे है नहीं करना चाहते हैं ...

क्या आपके पास कोई विचार है कि यह बेहतर कैसे करें?

बहुत बहुत धन्यवाद!

उत्तर

2

मैं जावा में एक बड़े और जटिल पुस्तकालय जो बड़े पैमाने पर एक बहुत ही स्वच्छ और साफ तरीके से आगंतुक पैटर्न का उपयोग करता है के साथ काम करते हैं। विशेष रूप से, मैं टाइप एरर की एक ही समस्या के साथ आया और इसे हल किया गया है।

यदि आपके पास कोई मौका है, तो कृपया an article I've written about this पर एक नज़र डालें।

यह एक लंबा लेख है, जो विस्तार से बताता है कि विज़िटर पैटर्न अवधारणा के बारे में क्या है और लेख के आखिरी हिस्से में, इस पर एक वास्तविक जीवन उदाहरण पर चर्चा की गई है जिसमें बहुरूपता और प्रकार का क्षरण शामिल है।

चीयर्स

0

मैं एक एकल अपरिवर्तित विज़िटर इंटरफ़ेस का उपयोग करूंगा, फिर विज़िटर विधि के अंदर प्रकार के आधार पर प्रेषण करें।

+0

आपका मतलब "उदाहरण" का उपयोग करना है? यही वह विज़िटर पैटर्न टालना चाहता है। इसके अलावा, मुझे इन्हें लिखना होगा यदि प्रत्येक आगंतुक (MySmallVisitor, MyFullVisitor और अन्य) में ब्लॉक। – Philipp

+0

हाँ, मेरा मतलब उदाहरण है। इससे बचने का प्रयास करने से अंत में बहुत अधिक कोड हो सकता है। –

+0

यदि मैंने वर्णित समस्या से निपटने के लिए वास्तव में कोई रास्ता नहीं है, तो मुझे कोड के उदाहरण से अधिक कोड चाहिए ... गरीब भाषा :-( – Philipp

-2

विधि के अंदर उदाहरण से बचने में सक्षम होने का कोई तरीका नहीं है। लेकिन आप इसे और अधिक सुंदर बना सकते हैं:

public interface MarkerInterface{} 

public interface ActionVisitor<T extends MarkerInterface> { 
void visitAction(T action);} 

public class A implements MarkerInterface{} 

public class B implements MarkerInterface{} 

public class MySmallActionVisitor implements ActionVisitor<MarkerInterface>{ 

@Override 
public void visitAction(MarkerInterface action) { 
    if(action instanceof A){ 

    } 
    else if(action instanceof B){ 

    } 
} 

}

+0

क्षमा करें, क्या आपने कभी विज़िटर पैटर्न के बारे में सुना है? बेशक इसे टालना संभव है http://en.wikipedia.org/wiki/Visitor_pattern#Java_example – Philipp

+0

खुशी मैंने कुछ नया सीखा। – LazyCubicleMonkey

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