2015-10-04 4 views
5

तो मैं अपनी खुद की ज़रूरत में एपीआई को विस्तार/अनुकूलित करने की सोच रहा हूं। मैं लेगो मिंडस्टॉर्म सी # एपीआई के बारे में बात कर रहा हूं। मैं इसके चारों ओर अपने स्वयं के एपीआई (एडाप्टर पैटर्न के आधार पर) बना रहा हूं, इसलिए मैं रोबोट को एक बेहतर ओओ तरीके से प्रोग्राम कर सकता हूं।एपीआई एक्सटेंशन में ऑब्जेक्ट चेनिंग बनाम तरीके

यहाँ कैसे एपीआई काम करता है के बारे में लिंक है: Lego Mindstorms EV3 C# API

लेकिन अब मैं एक बहुत ही अजीब तरह से सी # एपीआई ईंट को आदेश संभालती पर अटक कर रहा हूँ।

निश्चित रूप से नहीं OO तरह से ...

एक उदाहरण: ईंट आप ईंट का एक उदाहरण आदेश भेजने के लिए की आवश्यकता के लिए एक आदेश भेजने के लिए। लेकिन डायरेक्ट कॉमांड इंस्टेंस के पास ईंट के साथ कुछ लेना देना नहीं है।

await brick.DirectCommand.TurnMotorAtPowerAsync(OutputPort.A, 50, 5000); 

तो बात मैं करना चाहते हैं ईंट बनाने के लिए और DirectCommand शिथिल युग्मित है।

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

brick.BatchCommand.TurnMotorAtSpeedForTime(OutputPort.A, 50, 1000, false); 
brick.BatchCommand.TurnMotorAtPowerForTime(OutputPort.C, 50, 1000, false); 
brick.BatchCommand.PlayTone(50, 1000, 500); 
await brick.BatchCommand.SendCommandAsync(); 

तो बात मैं करना चाहते हैं यह है:

प्लेटोन की तरह एक आदेश (..) बनाएं आदेशों की एक ArrayList और फिर इसे लूप करने के लिए इसे जोड़ने के ...

List<Command> toBeExecuted = new List<Command>; 
toBeExecuted.Add(DirectCommand.PlayTone(50, 1000, 500)); 
brick.DirectCommand(toBeExecuted[0]); 

तो अगर किसी को भी मदद कर सकता है ... मैं बहुत खुश हो जाएगा :)

उत्तर

1

नहीं जैसा कि वे के लिए डिजाइन किए गए थे, लेकिन आप उन्हें कतार सकता है अल के रूप में कार्य का आईएसटी, और इसके बजाए पास?

तो जैसा

:

static void Main(string[] args) 
{ 
    //---- queue commands into a "batch" 
    List<Task> toBeExecuted = new List<Task>(); 
    toBeExecuted.Add(Task.Run(() => dothing())); 
    toBeExecuted.Add(Task.Run(() => dothing())); 
    toBeExecuted.Add(Task.Run(() => dothing())); 
    toBeExecuted.Add(Task.Run(() => dothing())); 
    toBeExecuted.Add(Task.Run(() => dothing())); 


    //---- elsewhere 
    Task.WaitAll(toBeExecuted.ToArray()); //fire off the batch 
    await brick.BatchCommand.SendCommandAsync(); //send to brick 
} 

स्थानापन्न dothing() batchcommand आप क़तार में चाहते हैं के लिए:

.Add(Task.Run(() => brick.BatchCommand...()));

+0

हाँ यह एक बहुत अच्छा विचार होगा। इस कार्यान्वयन के साथ एकमात्र समस्या यह है कि मैं ईंट ऑब्जेक्ट से अलग से कमांड क्लास के उदाहरणों का उपयोग नहीं कर सकता। यह उन मुख्य चीजों में से एक है जो मैं करना चाहता हूं, क्योंकि मैं ईंट से अलग-अलग आदेशों को लागू करने में सक्षम होना चाहता हूं, जिन्हें बाद में निष्पादित किया जाएगा। –

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