C#中的类和基类继承

时间:2015-11-13 17:36:12

标签: c# inheritance

我在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一起使用。

我该如何设置呢?

3 个答案:

答案 0 :(得分:15)

创建一个抽象的Chart类:

abstract class Chart
{
    // Shared properties
}

然后继承它:

class BarChart : Chart
{
    // Bar chart properties
}

然后你可以创建它:

Chart someChart = new BarChart();

答案 1 :(得分:10)

您需要创建一个这样的界面:

    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。就个人而言,我会避免使用抽象类,直到您确定所有可以封装的图表都有真正的通用逻辑。没有理由现在过度设计,只需使用界面。

我希望这有用!

答案 2 :(得分: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关键字的方法,以便子类的方法可以覆盖对基类的方法的调用&#39;方法。

抽象类与接口

与接口不同,抽象类允许您定义其中的方法。接口中的方法都只是签名。在抽象类中,您还可以使用仅定义其签名的抽象方法。但是,抽象类在继承中像常规类一样工作;你只能从一个继承。您可以从任意数量的接口继承。如果您希望BarChart继承Chart以及IComparable这样的界面,则您首先要使用抽象类来声明类,如public class BarChart : Chart, IComparable