2015-11-13 90 views
9

我在C#中的一類,像這樣:類和基類繼承在C#

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 

我對C#比較陌生,繼承的概念對我來說有點陌生。在一天結束時,我將有多個不同的圖表類型像線型圖,條形圖等,但我也希望能夠將它們四處移動,並對其進行排序,像這樣:

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

...因此,想法把它們扔到通用的Chart類中,以便與LINQ一起使用。

我該怎麼去設置它?

+0

@DarrenYoung也許不是全部。我想只有共享的。對於我的使用,我實際上只需要R​​owNumber即可共享。 – konrad

+0

你能接受一個答案嗎? –

回答

15

創建一個抽象的圖表類:

abstract class Chart 
{ 
    // Shared properties 
} 

然後繼承它:

Chart someChart = new BarChart(); 
+1

你爲什麼認爲它需要抽象? –

+3

如果沒有類型(線條,條形,餅圖),它對我來說當然看起來很抽象,但它與問題並不嚴格相關。 – spender

+1

@DavidPine我想我總是以抽象爲基礎開始創建一個基類,直到它需要具體化(當然,這總是在設計階段 - 你永遠不想在後期製作中做這個改變)。 –

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。就個人而言,我會避免使用抽象類,直到您確定所有可封裝的圖表都具有真正的通用邏輯。現在沒有理由過度設計,只需使用界面即可。

我希望這有幫助!

+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) 
    { 

    } 
} 

上的方法你要確保你使用virtualoverride關鍵字,調用基類的方法被子類的方法覆蓋。

抽象類VS接口

不同的接口,抽象類可以讓你在它定義的方法。接口中的方法都只是簽名。在抽象類中,您也可以擁有僅定義了其簽名的抽象方法。儘管抽象類像繼承中的常規類一樣工作,你只能從一個繼承。只要你願意,你可以從儘可能多的接口繼承。如果你想讓BarChart繼承ChartIComparable這樣的接口,你應該首先聲明類爲抽象類,如public class BarChart : Chart, IComparable