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#比较陌生,inheritance的概念对我来说有点陌生。 在一天结束时,我将有多种不同的图表类型,如LineChart,BarChart等,但我也希望能够移动它们并按​​如下方式对它们进行排序:

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

…因此想把它们放到通用的Chart类中,以便于LINQ使用。

我该如何设置呢?

创建一个抽象的Chart类:

 abstract class Chart { // Shared properties } 

然后inheritance它:

 class BarChart : Chart { // Bar chart properties } 

然后你可以创建它:

 Chart someChart = new BarChart(); 

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

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

然后让其他类inheritance基类…

  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 () {} } 

您希望inheritance类看起来像这样:

 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关键字,以便子类的方法可以覆盖对基类的方法的调用。

抽象类与接口

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