2016-02-29 9 views
5

मैं एक साधारण व्यवहार एआई बनाने पर एक ट्यूटोरियल ले रहा हूं। यह 'मस्तिष्क' वर्ग अमूर्त है और इसमें "चलने", "सफलता", "विफलता" के रूप में राज्य शामिल हैं। अब मेरी एआई इकाई में - Droid क्लास में मेरे पास Droid अप के मस्तिष्क को शुरू करने का एक तरीका है।क्या कक्षा वर्ग में एक अमूर्त वर्ग विधि का संदर्भ बनाना संभव है जो इसे विस्तारित नहीं करता है?

public void update(){ 

     if(Routine.getState()==null){ 
      Routine.start(); 
     } 
     Routine.act(this, board); 

    } 

अब यह जावा में संभव नहीं है क्योंकि यह एक गैर स्थैतिक विधि का स्थिर संदर्भ है। दिनचर्या सार वर्ग है कि मैं यहाँ करने के लिए संदर्भ के लिए कोशिश कर रहा हूँ इस प्रकार है:

public abstract class Routine { 

    public enum RoutineState{ 
     Success, 
     Failure, 
     Running 
    } 

    protected RoutineState state; 

    protected Routine() { } 

    public void start(){ 
     this.state = RoutineState.Running; 
    } 

    public abstract void reset(); 

    public abstract void act(droid droid, board board); 

    public void succed(){ 
     this.state = RoutineState.Success; 
    } 

    public void Fail(){ 
     this.state = RoutineState.Failure; 
    } 

    public boolean isSuccess(){ 
     return state.equals(RoutineState.Success); 
    } 

    public boolean isFailure(){ 
     return state.equals(RoutineState.Failure); 
    } 

    public boolean isRunning(){ 
     return state.equals(RoutineState.Running); 
    } 

    public RoutineState getState(){ 
     return state; 
    } 


} 

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

+1

क्या कारखाने द्वारा ऐसी एक कक्षा शुरू करने और उदाहरण का उपयोग करने के लिए उपयोग संभव है? आप अंतिम नियमित दिनचर्या = RoutineFactory.createRoutine() घोषित कर सकते हैं; और वांछित के रूप में अपनी कॉल में इसका इस्तेमाल करें। आपको विधियों को चलाने के लिए वहां एक कार्यान्वयन की आवश्यकता होगी क्योंकि आपको इंस्टेंस विशिष्ट आइटम अपडेट करने की आवश्यकता है। आप विरासत का उपयोग क्यों नहीं कर सकते? –

+0

आपको निश्चित रूप से उस पर एक विधि कॉल करने के लिए एक ऑब्जेक्ट उदाहरण की आवश्यकता है (सार या नहीं)। – Thilo

उत्तर

1

निश्चित रूप से, आप एक अमूर्त वर्ग का संदर्भ दे सकते हैं और इसके सार वर्गों को कॉल कर सकते हैं, लेकिन जिस वस्तु को आप बिल्कुल संदर्भित करते हैं वह सार वर्ग का विस्तारक होना चाहिए।

उदाहरण के लिए, विभिन्न वस्तुओं की एक सूची बनाएं, सभी एक अमूर्त वर्ग का विस्तार करें।

public abstract class ExAbstract { public abstract void abstractmethod() {...} } 
public class ExampleA extends ExAbstract { @Override... } 
public class ExampleB extends ExAbstract { @Override... } 
... 

List<ExAbstract> list = new ArrayList<>(); 
list.add(new ExampleA()); 
list.add(new ExampleB()); 
... 

और फिर, आप उस पर अमूर्त विधि को कॉल कर सकते हैं।

for (ExAbstract test : list){ 
    test.abstractmethod(); 
} 

(या जावा 8)

list.forEach(ExAbstract::abstractmethod); 

लेकिन वस्तु Abstact का विस्तार नहीं किया गया था, और यह सार ही था, यह एक त्रुटि देना होगा।

संपादित करें: अपने मामले में, नियमित कक्षा के साथ, आपको इसके लिए एक निर्माता बनाना चाहिए, और फिर एक नई वस्तु बनाना चाहिए। आप एक वस्तु बनाने के बिना एक विधि का उपयोग करना चाहते हैं (मैं आप पहले से ही एक निर्माता है ... देखें), static

का उपयोग Routine.java में:

public Routine(ExampleArg a){ 
    this.a = a; 
} 

अपने नियमित कॉल में:

Routine r = new Routine(a); 
r.start(); 
संबंधित मुद्दे