我在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一起使用。
我该如何设置呢?
答案 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)
{
}
}
对于您要确保使用virtual
和override
关键字的方法,以便子类的方法可以覆盖对基类的方法的调用&#39;方法。
抽象类与接口
与接口不同,抽象类允许您定义其中的方法。接口中的方法都只是签名。在抽象类中,您还可以使用仅定义其签名的抽象方法。但是,抽象类在继承中像常规类一样工作;你只能从一个继承。您可以从任意数量的接口继承。如果您希望BarChart
继承Chart
以及IComparable
这样的界面,则您首先要使用抽象类来声明类,如public class BarChart : Chart, IComparable
。