[英]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)
{
}
}
在方法上,您需要確保使用virtual
和override
關鍵字,以便子類的方法可以覆蓋對基類的方法的調用。
抽象類與接口
與接口不同,抽象類允許您定義其中的方法。 接口中的方法都只是簽名。 在抽象類中,您還可以使用僅定義其簽名的抽象方法。 但是,抽象類在繼承中像常規類一樣工作; 你只能從一個繼承。 您可以從任意數量的接口繼承。 如果您希望BarChart
繼承Chart
和類似IComparable
的接口,您首先要使用抽象類來聲明類,如public class BarChart : Chart, IComparable
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.