2010-12-10 11 views
14

मैंने बेस क्लास में विधि और override को नई कक्षा में virtual जोड़कर विधियों का वारिस कैसे किया। लेकिन गुणों के उत्तराधिकारी के लिए मैं क्या करूँ?सी # में विरासत वर्ग संपत्ति को ओवरराइड कैसे करें?

class bird 
{ 
    private virtual string fly = "Yes, I can!"; 
    public string CanI() { return fly ; } 
} 

class penguin : bird 
{ 
    private override string fly = "No, I can't!"; 
} 

यह एक त्रुटि दिखाई दे, कह रही है कि संशोधक virtual/override यहाँ नहीं किया जाना चाहिए।

उत्तर

25

fly एक संपत्ति नहीं है, यह एक क्षेत्र है। फ़ील्ड ओवरराइड करने योग्य नहीं हैं। आप ऐसा कर सकते हैं:

class bird { 
    protected virtual string Fly { 
     get { 
      return "Yes, I can!"; 
     } 
    } 
    public string CanI() { return Fly; } 
} 

class penguin : bird { 
    protected override string Fly { 
     get { 
      return "No, I can't!"; 
     } 
    } 
} 

ध्यान दें कि मैं flyprotected के रूप में चिह्नित करने के लिए किया था।

abstract class Bird { 
    public abstract bool CanFly { get; } 
    public string SayCanFly() { 
     if(CanFly) { 
      return "Yes, I can!"; 
     } 
     else { 
      return "No, I can't!"; 
     } 
    } 
} 

class Penguin : Bird { 
    public override bool CanFly { 
     get { 
      return false; 
     } 
    } 
} 

class Eagle : Bird { 
    public override bool CanFly { 
     get { 
      return true; 
     } 
    } 
} 
+0

काम करने लगता है, धन्यवाद! :) – Rob

+3

@Downvoter: वास्तव में, आपको समझा जाना चाहिए। – jason

+0

मैंने अब डाउनवोट देखा। मैं वास्तव में आपको जवाब देने के लिए नहीं चाहता था। नकली माउस क्लिक करें? असुविधा के लिए खेद है, मैंने इसे हटा दिया। – Luca

3

कि अपने उदाहरण में एक संपत्ति नहीं है, यह एक क्षेत्र है:

लेकिन फिर भी बेहतर है, मैं कुछ इस तरह करना होगा। किसी संपत्ति का उपयोग करने का प्रयास करें, या बस फ्लाई को सुरक्षित के रूप में चिह्नित करें ताकि इसे आपके उप-वर्ग में एक्सेस किया जा सके।

1

इस कोड:

private virtual string fly = "Yes, I can!"; 

एक क्षेत्र है, न कि संपत्ति पैदा कर रही है। साथ ही, वर्चुअल होने के लिए, आपकी संपत्ति के पास 'निजी' से अधिक पहुंच होनी चाहिए। आप शायद इस तरह कुछ चाहते हैं:

public virtual string Fly 
{ 
    get { return "Yes, I can!"; } 
} 
संबंधित मुद्दे