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) { } }
在方法上,您需要确保使用virtual
和override
关键字,以便子类的方法可以覆盖对基类的方法的调用。
抽象类与接口
与接口不同,抽象类允许您定义其中的方法。 接口中的方法都只是签名。 在抽象类中,您还可以使用仅定义其签名的抽象方法。 但是,抽象类在inheritance中像常规类一样工作; 你只能从一个inheritance。 您可以从任意数量的接口inheritance。 如果您希望BarChart
inheritanceChart
和类似IComparable
的接口,那么您首先要使用抽象类来声明类,如public class BarChart : Chart, IComparable
。