簡體   English   中英

C#中的類和基類繼承

[英]Classes and base class inheritance in 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#比較陌生,繼承的概念對我來說有點陌生。 在一天結束時,我將有多種不同的圖表類型,如LineChart,BarChart等,但我也希望能夠移動它們並按​​如下方式對它們進行排序:

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

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

我該如何設置呢?

創建一個抽象的Chart類:

abstract class Chart
{
    // Shared properties
}

然后繼承它:

class BarChart : Chart
{
    // Bar chart properties
}

然后你可以創建它:

Chart someChart = new BarChart();

你需要創建一個這樣的界面:

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

我希望這是有幫助的!

你可能不希望你的基本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關鍵字,以便子類的方法可以覆蓋對基類的方法的調用。

抽象類與接口

與接口不同,抽象類允許您定義其中的方法。 接口中的方法都只是簽名。 在抽象類中,您還可以使用僅定義其簽名的抽象方法。 但是,抽象類在繼承中像常規類一樣工作; 你只能從一個繼承。 您可以從任意數量的接口繼承。 如果您希望BarChart繼承Chart和類似IComparable的接口,您首先要使用抽象類來聲明類,如public class BarChart : Chart, IComparable

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM