2015-11-13 7 views
9

में आधार वर्ग विरासत मैं बहुत की तरह सी # में एक वर्ग है:वर्ग और सी #

public class BarChart 
{ 
    public BarData BarChartData; 
    public BarStyle BarChartStyle; 

    public BarChart(BarData data, BarStyle style) 
    { 
     this.BarChartData = data; 
     this.BarChartStyle = style; 
    } 

    string _uniqueName; 
    public string UniqueName 
    { 
     get { return this._uniqueName; } 
     set { this._uniqueName = value; } 
    } 
    string _rowNumber; 
    public string RowNumber 
    { 
     get { return this._rowNumber; } 
     set { this._rowNumber = value; } 
    } 

मैं एक वर्ग Chart बुलाया गुण BarChart वर्ग है कि के सभी होगा कि बनाना चाहते हैं। उदाहरण के लिए:

Chart someChart = new Chart(BarChart); 
string name = someChart.UniqueName 

मैं सी # के लिए अपेक्षाकृत नया हूं और विरासत की अवधारणा मेरे लिए थोड़ा सा विदेशी है। दिन के अंत में मैं लाइन चार्ट, BarChart, आदि जैसे कई अलग अलग चार्ट प्रकार होगा, लेकिन मैं यह भी चारों ओर तो जैसे उन्हें स्थानांतरित करने और सॉर्ट उन्हें सक्षम होना चाहते हैं:

List<Chart> groupedCharts = listOfCharts 
.GroupBy(u => u.RowNumber) 
.Select(grp => grp.ToList()) 
.ToList(); 

... इसलिए LINQ के साथ आसान उपयोग के लिए उन्हें सामान्य Chart कक्षा में फेंकने का विचार।

मैं इसे स्थापित करने के बारे में कैसे जाउंगा?

+0

@DarrenYoung शायद उन सभी को नहीं। मुझे लगता है कि केवल साझा किए गए हैं। मेरे उपयोग के लिए मुझे वास्तव में इस समय साझा करने के लिए केवल पंक्ति संख्या की आवश्यकता होगी। – konrad

+0

क्या आप एक उत्तर स्वीकार कर सकते हैं। –

उत्तर

15

एक सार चार्ट कक्षा बनाएं: फिर

abstract class Chart 
{ 
    // Shared properties 
} 

यह वारिस:

Chart someChart = new BarChart(); 
+1

आपको क्यों विश्वास है कि इसे अमूर्त होने की आवश्यकता है? –

+3

एक प्रकार (लाइन, बार, पाई) के बिना, यह निश्चित रूप से मेरे लिए अमूर्त दिखता है, हालांकि यह सवाल के लिए सख्ती से प्रासंगिक नहीं है। – spender

+1

@ डेविडपिन मुझे लगता है कि मैं हमेशा एक नियम के रूप में सार से एक बेस क्लास शुरू करता हूं जब तक इसे ठोस नहीं होना चाहिए (यह हमेशा डिजाइन चरण के दौरान होता है - आप कभी भी इस बदलाव को बाद में उत्पादन नहीं करना चाहते हैं)। –

10

आप इस तरह एक अंतरफलक बनाने की जरूरत: के रूप में

class BarChart : Chart 
{ 
    // Bar chart properties 
} 

तो फिर तुम यह बना सकते हैं :

public interface IChart 
    { 
     string UniqueName { get; set; } 

     string RowNumber { get; set; } 
    } 

फिर

public class BarChart : IChart 
    { 
     public BarData BarChartData { get; private set; } 
     public BarStyle BarChartStyle { get; private set; } 

     // Other custom members you desire for your bad chart implementation 

     public BarChart(BarData data, BarStyle style) 
     { 
      BarChartData = data; 
      BarChartStyle = style; 
     } 
    } 

MSDN उदाहरण विस्तृत here हैं अन्य वर्गों जैसे आधार वर्ग के वारिस है ...। व्यक्तिगत रूप से, मैं एक अमूर्त वर्ग का उपयोग करने से बचूंगा जबतक कि आप यह निर्धारित नहीं करते कि सभी चार्टों के लिए वास्तव में सामान्य तर्क है जो encapsulated किया जा सकता है। अब ओवर-डिज़ाइन करने का कोई कारण नहीं है, बस एक इंटरफ़ेस का उपयोग करें।

मुझे आशा है कि यह सहायक होगा!

+0

छोटे निगल ... "बेस क्लास विरासत" की बजाय आप "इंटरफ़ेस को विरासत/कार्यान्वित करना" प्रदर्शित कर रहे हैं। – spender

4

शायद आप अपने बेस Chart को तत्काल प्राप्त करने के लिए नहीं चाहते हैं क्योंकि इसका कार्य नोडस्क्रिप्ट है, इसलिए आप इसे एक अमूर्त वर्ग बनना चाहते हैं।

public abstract class Chart 
{ 
    // Public properties common to all charts 
    public ChartData data; 
    public ChartStyle style; 
    public string RowNumber { get; set; } 
    public string UniqueName { get; set; } 

    // A common method  
    public void AddDataPoint() {} 

    // A method all charts have that may change between different types of charts 
    public virtual void DrawChart() {} 

    // Constructor 
    public Chart (ChartData cd, ChartStyle cs) 
    { 
     data = cd; 
     style = cs; 
    } 

    // Protected method (like a private method, but gets inherited) 
    protected void Finalize() {} 
} 

आप इस तरह देखने के लिए इनहेरीट वर्ग चाहते हैं:

public class BarChart : Chart 
{ 
    // BarChart exclusive properties 

    // A method all charts have that BarCharts implements differently 
    public override void DrawChart() {} 

    // Constructor that calls the base constructor 
    public BarChart (ChartData cd, ChartStyle cs) : base (cd, cs) 
    { 

    } 
} 

तरीकों पर आप चाहते हैं आप virtual और override खोजशब्दों का उपयोग सुनिश्चित करने के लिए इतना है कि आधार वर्ग के तरीकों के लिए कॉल बाल वर्ग के तरीकों से ओवरराइड हो जाओ।

सार वर्गों बनाम इंटरफेस

एक इंटरफेस के विपरीत, एक अमूर्त वर्ग आप इसे में पद्धतियां निर्धारित करने की अनुमति देता है। इंटरफ़ेस में विधियां केवल हस्ताक्षर हैं। अमूर्त वर्ग में आप सार तत्व भी बना सकते हैं जिनके केवल उनके हस्ताक्षर परिभाषित किए गए हैं। सार वर्ग विरासत में नियमित कक्षाओं की तरह काम करते हैं, हालांकि; आप केवल एक से प्राप्त कर सकते हैं। आप जितनी चाहें उतने इंटरफेस से उत्तराधिकारी हो सकते हैं।यदि आप Chart से प्राप्त करने के लिए और IComparable जैसे इंटरफेस के लिए चाहते थे, तो आप कक्षा को पहले श्रेणी public class BarChart : Chart, IComparable जैसे घोषित करेंगे।

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