2011-09-02 20 views
5

के बारे में मेरे पास एक सैद्धांतिक/प्रैक्टिकल सवाल है कि सी # में विरासत कैसे काम करती है।सी # और विरासत

मान लें कि मुझे कुछ ऑटो मॉडल करना है, इसलिए मेरे पास कुछ सामान्य तरीकों हैं जो सभी ऑटो को लागू करना चाहिए और एक पायलट को पता होना चाहिए।

interface Automobile { 
    void speedup(); 
    void break(); 
    void steer(); 
    //bla bla 
} 

अब, कार के सभी प्रकार है कि एक पायलट उन पर प्रदर्शन कर सकते हैं कार्यों के बगल में कुछ सामान्य तकनीकी कार्यान्वयन होना चाहिए, मान लें कि संपत्ति fuelLevel करते हैं, इस बिंदु मैं कम से: कोड-शब्दों में यह एक अंतरफलक होना चाहिए अभी भी पता है कि कैसे एक कार को गति या टूट जाती है नहीं करना चाहते, तो मैं लिखा होगा:

abstract class Car : Automobile { 
    int fuelLevel; // for example.... 
    public abstract void speedup(); 
    public abstract void break(); 
    public abstract void steer(); 
} 

अब मैं एक फेरारी मॉडल बनाना चाहते हैं, तो:

class Ferrari : Car { 
    public void speedup() { ... } 
    public void break() { ... } 
    public void steer() { ... } 
} 

अब, जावा इस में कोड शू एलडी काम (कुछ वाक्यविन्यास बदलना), लेकिन सी # में ऐसा नहीं होगा क्योंकि यह कहता है:

Error 1 'Ferrari' does not implement inherited abstract member 'Car.speedup()' 
Error 1 'Ferrari' does not implement inherited abstract member 'Car.break()' 
Error 1 'Ferrari' does not implement inherited abstract member 'Car.steer()' 

क्यों? मुझे इस समस्या को कैसे ठीक करना चाहिए? आप तैयार हैं

class Ferrari : Car 
{ 
    public override void speedup() { } 
    public override void break() { } 
    public override void steer() { } 
} 

उसके अलावा, - Ferrari वर्ग अपने इंटरफेस को पूरा करेगा, भले ही तरीकों प्राप्त कर रहे हैं:

उत्तर

16

आप override साथ तरीकों चिह्नित करने के लिए नीचे abstract परिभाषाओं को कवर करने की जरूरत है। I, IAutomobile साथ

  • उपसर्ग इंटरफेस: इसके अलावा एक अलग रूप में के रूप में, सी # में नामकरण थोड़ी अलग है।
  • विधियों पर पूंजी अक्षरों: Speedup(), Break(), Steer()
+0

के माध्यम से मुझे लगता है कि होना चाहिए यह जावा और सी # के बीच मतभेद में से एक है ... बहुत बहुत शुक्रिया। – IssamTP

+0

@ amod0017 हो गया। देर से खेद है, लेकिन मैं यहाँ 7 मिनट इंतजार करने में काफी व्यस्त हूं ... – IssamTP

+0

@IssamTP वास्तव में साइट पर समय के अनुसार, मुझे केवल जवाब देने में 3 मिनट लगे :-) –

3

आप वास्तव में अमूर्त वर्ग के सदस्यों को ओवरराइड करने के लिए अनदेखा कर रहे हैं। की तरह कुछ पर विचार करने का प्रयास करें:

interface IAutomobile 
{ 
    void Steer(); 
    void Break(); 
} 

abstract class Car : IAutomobile 
{ 
    public abstract void Steer(); 
    public abstract void Break(); 
} 

class Ferrari : Car 
{ 
    public override void Steer() 
    { 
     throw new NotImplementedException(); 
    } 

    public override void Break() 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

क्यों "नया फेंक दें"? – IssamTP

+0

@IssamTP जो विधियों का एक स्वचालित डिफ़ॉल्ट कार्यान्वयन है, ताकि आप कार्यान्वयन प्रदान किए बिना भी संकलित कर सकें, इससे कोई फर्क नहीं पड़ता कि विधि को मूल्य वापस करना चाहिए या नहीं। – TrymBeast

1

अच्छी तरह से, "disconnetti" (आप इतालवी कर रहे हैं?) विधि, कहीं भी नहीं लिखा है तो आप से पहले हमें समझाने चाहिए जहां कि से आता है।

दूसरा, सी # में जब आप एक सार विधि ओवरराइड, आप स्पष्ट यह ओवरराइड कीवर्ड

+0

हाँ मैं इतालवी हूं, वास्तविक कोड पोस्ट से थोड़ा अलग है क्योंकि यह उदाहरण समझना और समझाना आसान था।वैसे भी मैंने कोड को जल्द ही संपादित किया ... – IssamTP

+0

ठीक है, जवाब सिर्फ इतना है कि आपको वैसे ही कीवर्ड को ओवरराइड करना चाहिए, जैसा कि मैंने लिखा है (और अन्य भी)। Buona fortuna col codice;) –

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