2012-03-02 14 views
6

तो, स्कूल में हमें ओओपी में एक कार बनाने के लिए एक असाइनमेंट मिला, अब तक यह काफी आसान और सीधे आगे है। लेकिन अब मुझे चार रचनाकार बनाने की जरूरत है, एक पैरामीटर के साथ, दो एक पैरामीटर के साथ और दो पैरामीटर के साथ।एक पैरामीटर के साथ एकाधिक कन्स्ट्रक्टर

जहां तक ​​मुझे पता है कि ओवरलोडिंग कार्यों के तरीके से यह पता चलता है कि यह आपके द्वारा प्रदान किए जाने वाले पैरामीटर की मात्रा की जांच करता है और फिर जांचता है कि किस कन्स्ट्रक्टर का उपयोग करना है। चूंकि दो रचनाकार समान हैं, दोनों इनट्स स्वीकार करते हैं, केवल एक को राशि या गियर बदलने की जरूरत होती है, और अन्य को अधिकतम गति को बदलने की आवश्यकता होती है।

अतिरिक्त पैरामीटर पास किए बिना ऐसा करने का कोई तरीका है?

+0

मुझे लगता है कि आप असाइनमेंट को गलत तरीके से पढ़ते हैं: आप एक स्ट्रिंग के रूप में गियर (संख्या) या अधिकतम गति (एक संख्या) की मात्रा में क्यों गुजरेंगे? लेकिन यह अवलोकन समस्या को हल नहीं करता है। आपका संदेह अनिवार्य रूप से सही है - यह संदिग्ध है कि क्या एक अच्छा ओओपी डिज़ाइन यहां रचनाकारों का उपयोग करेगा। –

+0

क्या आपका * असाइनमेंट * कन्स्ट्रक्टर का उपयोग करने के लिए है, या यह * * असाइनमेंट * को असाइन करने का आपका तरीका है? –

+0

ऐसा लगता है कि अस्पष्टता का कारण बनता है। यकीन नहीं है कि यह भी संभव है। –

उत्तर

12

जहां तक ​​मुझे पता है कि ओवरलोडिंग कार्यों के तरीके से यह पता चलता है कि यह आपके द्वारा आपूर्ति किए जाने वाले पैरामीटर की मात्रा की जांच करता है और फिर जांचता है कि किस कन्स्ट्रक्टर का उपयोग करना है।

नहीं है, अधिक भार केवल मापदंडों के संख्या पर आधारित नहीं है - यह उनकी प्रकार भी पर आधारित है।

हालांकि:

निर्माताओं की दो के रूप में, एक ही हैं दोनों तार

एक समस्या है कि स्वीकार करता है। आप इस तरह दो कंस्ट्रक्टर्स की घोषणा नहीं कर सकते हैं:

public Foo(string x) 
{ 
} 

public Foo(string y) 
{ 
} 

उन हस्ताक्षरों जहाँ तक अधिक भार का संबंध है संघर्ष।

मैं सार्वजनिक स्थिर कारखाने तरीकों होने सुझाव है, तो आप क्या आप बनाने के लिए कोशिश कर रहे हैं निर्दिष्ट कर सकते हैं:

public static Foo FromGears(string gears) 
{ 
    return new Foo(...); 
} 

public static Foo FromMaximumSpeed(string maxSpeed) 
{ 
    return new Foo(...); 
} 

फिर आप संभवतः एक निर्माता जो दोनों मूल्यों को स्वीकार कर लिया होगा, और फ़ैक्टरी विधि से कन्स्ट्रक्टर को कॉल करते समय डिफ़ॉल्ट रूप से कोई भी गुम हो जाता है।

  • आप तार दो मानों जो ध्वनि की तरह वे संख्या (या संभवतः एक नंबर होना चाहिए, और एक number- के लिए उपयोग कर रहे हैं:

    हालांकि, वहाँ अपने विवरण में दो अन्य विषमताएं हैं और-इकाई)

  • आप रचनाकारों को घोषित करने के बारे में बात कर रहे हैं, लेकिन फिर "परिवर्तन" शब्द का उपयोग कर रहे हैं जैसे कि वे एक मौजूदा उदाहरण को बदलने जा रहे हैं। यह समझ में नहीं आता है - रचनाकारों का उपयोग नई ऑब्जेक्ट्स बनाने के लिए किया जाता है।

संपादित करें: ठीक है, अब हम एक थोड़ा और अधिक पता है, यहां बात की तरह है मेरा मतलब है:

public class Car 
{ 
    private const int DefaultGears = 5; 
    private const int DefaultTopSpeed = 180; 

    private readonly int gears; 
    private readonly int topSpeed; 

    public Car(int gears, int topSpeed) 
    { 
     this.gears = gears; 
     this.topSpeed = topSpeed; 
    } 

    public static Car CreateWithGears(int gears) 
    { 
     return new Car(gears, DefaultTopSpeed); 
    } 

    public static Car CreateWithTopSpeed(int topSpeed) 
    { 
     return new Car(topSpeed, DefaultGears); 
    } 
} 

ध्यान दें कि आप सकता है बहुत सी # 4 में उपयोग वैकल्पिक पैरामीटर और इस के लिए नामित किया गया तर्क :

public class Car 
{ 
    public const int DefaultGears = 5; 
    public const int DefaultTopSpeed = 180; 

    private readonly int gears; 
    private readonly int topSpeed; 

    public Car(int gears = DefaultGears, int topSpeed = DefaultTopSpeed) 
    { 
     this.gears = gears; 
     this.topSpeed = topSpeed; 
    } 
} 
फिर

:

Car car = new Car(gears: 4); 
Car car = new Car(topSpeed: 30); 

मैं सामान्य रूप से अनुशंसा नहीं करता हूं - निश्चित रूप से नहीं, जबकि आप अभी भी भाषा के लिए अपेक्षाकृत नए हैं। वैकल्पिक पैरामीटर के आसपास विभिन्न subtleties हैं।

+0

हाँ, मेरा मतलब संख्या, मेरा बुरा था। विचार एक डिफ़ॉल्ट कन्स्ट्रक्टर बनाना है जो कार की शीर्ष गति 180 किमी/घंटा बनाता है और इसमें 5 गीयर होते हैं। मुझे एक और कंडक्टर की आवश्यकता है जिसमें एक पैरामीटर है जो गियर राशि और एक अन्य नियंत्रक को बदलता है जो पैरामीटर के साथ शीर्ष गति को बदलता है। किसी कारण से मुझे इन रचनाकारों को बनाने की ज़रूरत है, और उन्हें विधियों के रूप में उपयोग नहीं करना चाहिए। – Gideon

+2

@Gideon: कॉल करना कि शीर्ष गति "बदलना" थोड़ा उलझन में है - यह * शीर्ष गति निर्दिष्ट * है। आप ऐसा कुछ नहीं बदल सकते जो अभी तक अस्तित्व में नहीं है! फिर भी, ऐसा लगता है कि मेरा बाकी उत्तर उचित है। –

+0

यदि मैं स्थैतिक फैक्ट्री विधियों विधि का उपयोग करूंगा। ऑब्जेक्ट बनने के बाद क्या यह सिर्फ एक पूर्णांक की मात्रा बदल रहा है? यदि हां, तो अब मैं इसका उपयोग करता हूं। – Gideon

1

अतिभारित तरीकों (और कंस्ट्रक्टर) उनके हस्ताक्षर में मतभेद है चाहिए। इसका मतलब है कि उनके पास अलग-अलग प्रकार (या दोनों) वाले पैरामीटर या पैरामीटर की एक अलग संख्या होनी चाहिए। पैरामीटर के नामों को ध्यान में नहीं रखा जाता है। इसका मतलब है कि आपके पास एक स्ट्रिंग पैरामीटर दोनों के दो कन्स्ट्रक्टर नहीं हो सकते हैं।

रचनाकारों को किसी वस्तु को प्रारंभ करने के लिए कुछ भी बदलने के लिए नहीं बनाया जाता है। यदि आप कोई मान बदलना चाहते हैं, तो ChangeGears(string gears) जैसी विधि जोड़ने पर विचार करें।

1

संक्षिप्त संख्या में। रचनाकार न केवल पैरामीटर की संख्या पर निर्भर करते हैं बल्कि उनके प्रकारों पर भी निर्भर करते हैं।

public Car(string gears) 
{ 

} 

public Car(string maxSpeed) 
{ 

} 

आपको लगता है कि फोन नहीं कर सकते, क्योंकि वे मूलतः एक ही निर्माता हैं, इसके बारे में सोचो, जब आप एक स्ट्रिंग में पारित, यह एक मूल्य है कि आप गुजर रहे हैं, इसलिए संकलक क्या निर्माता पता नहीं है उपयोग करने के लिए: यदि आप गियर की संख्या 6 या अधिकतम गति 6 तक सेट करना चाहते हैं तो कॉल अभी भी new Car("6") होगा, आप किस तरह की संदिग्ध नहीं कहेंगे?

होमवर्क कल्पना दो कंस्ट्रक्टर्स जो तार लेने के लिए नहीं कह सकता, क्योंकि यह असंभव है। वास्तव में इसे पूरा करने का एकमात्र तरीका तरीका स्थिर कारखाने के तरीकों का उपयोग करना होगा या जैसा कि आपने एक और पैरामीटर पेश करने के लिए कहा था।

क्या आप अन्य उत्तर में पर टिप्पणी की है को देखते हुए मुझे विश्वास करने के लिए कुछ इस तरह आप के लिए काम कर सकते हैं, लेकिन यह पता करने के लिए वास्तव में क्या अपना होमवर्क करना चाहता है कठिन है।

public Car() 
{ 
    ... // Do your setting of your default values here (# of gears, max speed) 
} 

public Car(int n) 
{ 
    if(n > 10) 
    { 
     // Use n to set your max speed 
    } else { 
     // Use n to set your # of gears 
    } 
} 

यह संभावना नहीं लगता है कि एक कार 10 से अधिक गियर के अधिकारी सकेगा या उसके अधिकतम गति 10 से कम तो इस तरह से आप गियर और शीर्ष के दोनों अपने # स्थापित करने के लिए एक एकल निर्माता का उपयोग कर सकते हो जाएगा कि, गति। (आपने जो पूछा है उससे ध्यान रखें कि यह शायद आपके होमवर्क का जवाब नहीं देगा, लेकिन यह एक ऐसा तरीका होगा जो आईएमओ को एक कन्स्ट्रक्टर का उपयोग करने के लिए पर्याप्त होगा जो अधिकतम गति और गियर की संख्या को एक और पैरामीटर जोड़ने के बिना सेट कर सकता है, यह मानते हुए कि आपके पास है गारंटी के कुछ प्रकार की कारों अधिकतम गति> = 10 है और गियर की संख्या < 10 कि)

+0

तो, मुझे बस एक निजी int gears = 5 बनाना होगा; कन्स्ट्रक्टर में डिफ़ॉल्ट के रूप में, और एक समारोह जो इसे बदलता है? क्योंकि अब मेरे पास यही है। शायद यह विवरण में एक गलती है .. – Gideon

+0

@Gideon एक विचार को प्रतिबिंबित करने के लिए संपादित किया गया है, ध्यान रखें कि यह संभवतः आपके होमवर्क का जवाब देने के लिए पर्याप्त नहीं है। – NominSim

0
public Car(string param, bool isGear) 
{ 
    if(isGear) 
     gears = param; 
    else 
     maxSpeed = param; 
} 
+0

यह सोच रहा था, लेकिन विचार केवल 1 पैरामीटर पास करना है, और इस तरह, इसकी 2। – Gideon

1

हर विधि (कंस्ट्रक्टर्स सहित) एक हस्ताक्षर है। हस्ताक्षर पैरामीटर प्रकार और उनके आदेश शामिल हैं। आपके पास दो विधियां नहीं हो सकतीं जो समान नाम और हस्ताक्षर साझा करती हैं।

मुझे लगता है कि पैरामीटर स्ट्रिंग्स की आवश्यकता एक गलतफहमी है।इस मामले में मैं मानता हूं कि गियर्स की संख्या हमेशा एक पूर्ण संख्या है - सर्वोत्तम पूर्णांक के रूप में प्रतिनिधित्व किया जाता है। और अधिकतम गति एक आंशिक मूल्य हो सकती है - संभवतः एक डबल या फ्लोट।

public class Car 
{ 
    public Car(int gears) {} 
    public Car(float maxSpeed) {} 
} 
संबंधित मुद्दे