2012-08-06 11 views
7

मान लें कि मेरे पास अमूर्तVehicle कक्षा और कार, ट्रक, मोटरसाइकिल सार कक्षाएं हैं जो Vehicle से प्राप्त होती हैं। यह भी कल्पना करें कि मुझे एक ईंधन वाली कार या इलेक्ट्रिक आधारित कार बनाने में सक्षम होना चाहिए और इसी तरह ट्रक और मोटरसाइकिल के लिए भी। (ठोस वर्ग)मैं विभिन्न हस्ताक्षरों के साथ एक पॉलिमॉर्फिक विधि कैसे बना सकता हूं

दो सवाल:

1.Consider कि मैं जानते हुए भी कि यह क्या है एक बहुरूपी तरीके से, बिना एक वाहन में ऊर्जा को भरने के लिए चाहते हैं। उदाहरण के लिए यदि वाहन आधारित है ईंधन मैं ईंधन के साथ भरने के लिए चाहते हैं और विधि 3 मानकों के साथ किया जाना चाहिए:
void FillUpEnergy(EfuelType i_fuelType,int amounOfEnergy, int maxAmountOfEnergy)

लेकिन electricy आधारित वाहन के लिए मैं लगभग एक ही समारोह signture लेकिन इस बार के ईंधन के प्रकार के बिना की जरूरत है बेशक, उदाहरण के लिए (2 पैरामीटर):

void FillUpEnergy(int amounOfEnergy, int maxAmountOfEnergy) 

मैं ऊपर की कमी के साथ एक polymorhic FillUpEnergy विधि कर सकता हूँ? (अलग पद्धति के हस्ताक्षर)

मेरी कार्यान्वयन 2.In सभी ठोस वर्ग Engine के लिए एक संदर्भ (एक और अमूर्त वर्ग) जो एक FuelEngine या ElectricEngine (अन्य ठोस वर्ग मेरे पास है जो इंजन से निकाले जाते हैं) का प्रतिनिधित्व करते हैं पकड़ो। उदाहरण के लिए मेरे पास ElectricCar नामक एक ठोस वर्ग है जिसमें ElectricEngine का संदर्भ है।
क्या यह वास्तुकला काफी अच्छा है या गेराज सिस्टम को लागू करने के बेहतर तरीके हैं?

+1

मैं काफी 1 नहीं मिलता है) 2 के रूप में), यह ब्रिज कहा जाता है और यह डिजाइन पैटर्न में से एक है कहते हैं। –

+0

ब्रिज पैटर्न मेरा पहला विचार भी था। –

उत्तर

8

आप अलग अलग हस्ताक्षरों के साथ एक बहुरूपी "धक्का शैली" विधि नहीं बना सकते हैं, लेकिन आप अच्छी तरह से प्रचारित Visitor Pattern का उपयोग कर एक बहुरूपी "पुल शैली" विधि बना सकते हैं।

विचार बातचीत के अनुक्रम को उलटने के लिए, और कार वस्तु तय क्या करना चलो है: इसके बजाय FillUpEnergy और बुला क्या आप इसे की आवश्यकता है कार देने की, FillUpEnergy फोन और कार लेते हैं क्या यह यह की जरूरत है, इस तरह जानता है:

interface IEnergyProvider { 
    void TakeFuel(EfuelType i_fuelType, int amounOfEnergy); 
    void TakeElectricity(int amounOfEnergy); 
} 
interface ICar { 
    void FillUpEnergy(IEnergyProvider provider); 
} 

अब आप अपने बहुरूपी विधि के हस्ताक्षर तय हो गई है, लेकिन विधि के प्रेषण एक की जगह दो पैर लेता है:

  • आप myCar.FillUpEnergy(myProvider)
  • कार कॉल myProvider.TakeFuel या myProvider.TakeElectricity
+2

अच्छा जवाब! पुराने अवतार मिस – dash

+1

लेकिन यहां अनावश्यक परिसर नहीं है? बिजली लेने और किसी अन्य प्रकार की ईंधन लेने के बारे में एक ही अवधारणा की तरह लगता है ... –

+0

@ सेबेस्टियन आप आगंतुक पैटर्न के बारे में बिल्कुल सही हैं: यह आसानी से हाथ से बाहर हो सकता है, खासकर यदि आपको विस्तारशीलता बनाए रखने की आवश्यकता है। लेकिन पदानुक्रमों के मामलों में जिन्हें पहले निर्दिष्ट किया जा सकता है, जैसे कि यह एक बड़ा सौदा नहीं होना चाहिए: केवल कुछ मुट्ठी भर तरीकों के साथ, आपके दिमाग में बातचीत के माध्यम से चलना आसान रहता है। जहां तक ​​गैस और इलेक्ट्रिक के साथ एक ही अवधारणा है, मुझे लगता है कि डिजाइन दर्शाता है कि एकल 'फिलअपनेर्जी' विधि प्रदान करके। – dasblinkenlight

3

के बारे में प्रश्न 1)

(वस्तु उन्मुख डिजाइन आदि .. के संदर्भ में) आप fueltype की बिजली/पेट्रोल हिस्सा बनाने और अपने डोमेन तर्क में इस संभाल सकता था।

सी # विभिन्न हस्ताक्षरों के साथ बहुरूपता प्रदान नहीं करता है।

2) संरचना

0
  1. आप ऐसा नहीं कर सकते कहा जाता है, क्योंकि यह वास्तव में कैप्सूलीकरण का उल्लंघन होगा।
  2. मैं इंजन के बारे में आपके प्रश्न को समझ नहीं पा रहा हूं, लेकिन मैं निश्चित रूप से कह सकता हूं कि "गेराज सिस्टम" को लागू करने के कई बेहतर तरीके हो सकते हैं क्योंकि बहुत सारे "गेराज सिस्टम" हैं। वास्तव में इसका मतलब है कि आपको अपनी प्रणाली (ओओपी या किसी अन्य शर्तों के संदर्भ में) मॉडल करने की कोशिश नहीं करनी चाहिए जबतक कि आपको अपनी आवश्यकताओं का अच्छी समझ न हो।
1

FueledCar से ElectricCar को क्या अंतर करता है? इंजन के अलावा कुछ भी नहीं (अवधारणात्मक):

interface IEngine 
{ 
    void FillUpFuel(int amountOfFuel, int maxAmountOfFuel); 
} 

class ElectricEngine : IEngine 
{ 
    public void FillUpFuel(int amountOfFuel, int maxAmountOfFuel) { ... } 
} 

abstract class Vehicle 
{ 
    public abstract IEngine Engine { get; } 
} 

class Car : Vehicle 
{ 
    public IEngine _engine; 
    public override IEngine Engine { get { return _engine; } } 

    public Car(IEngine engine) 
    { 
     _engine = engine; 
    } 
} 
... 
var electricCar = new Car(new ElectricEngine()); 
electricCar.Engine.FillUpFuel(40, 70); 

विशिष्ट रचना बनाम विरासत उदाहरण। इलेक्ट्रिकइंजिन ईंधन भरने के साथ नामकरण थोड़ा अजीब है ... लेकिन यह बात नहीं है।

0

बारे 1)
FillUpEnergy बहुरूपी (subtype polymorphism होने के बिंदु) इस विधि कॉल करने के लिए जब केवल एक चीज आप जानते हैं कि वस्तु एक Vehicle है सक्षम होने के लिए है।

यदि आपको तर्क के सही सेट को चुनने के लिए सही प्रकार को जानने की आवश्यकता है, तो इस क्रिया को पॉलीमोर्फिक होने की आवश्यकता नहीं है।

बारे में 2)
कुछ भी नहीं के चौंकाने वाला

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