[英]Use of abstract classes, interface and List in C#
我有以下代碼部分,並且我正在嘗試實現一種返回列表的方法。 我的結構如下:抽象類“ Coordinates”->公共類“ YCoordinate”,我的接口指向“ YCoordinate”。 我不希望我的界面直接與我的抽象類聊天,因為我覺得我的抽象類的實現負責工作。
介面
interface IYCoordinate
{
System.Collections.Generic.List<Coordinates> GetYCoordinateList();
}
抽象類:
public abstract class Coordinates
{
private int coordinatePriority;
private int coordinate;
public Coordinates(int CoordinatePriority, int Coordinate)
{
this.CoordinatePriority = CoordinatePriority;
this.Coordinate = Coordinate;
}
public Coordinates() { }
public int CoordinatePriority { get { return coordinatePriority; } set { coordinatePriority = value; } }
public int Coordinate { get { return coordinate; } set { coordinate = value; } }
public virtual List<Coordinates> GetYCoordinateList()
{
throw new System.NotImplementedException();
}
}
接口和抽象類的實現(這是中斷的部分):
public class YCoordinate : Coordinates, IYCoordinate
{
public override List<Coordinates> GetYCoordinateList()
{
List<Coordinates> _list = new List<Coordinates>();
_list.Add(new IYCoordinate(1, 5000));
_list.Add(new IYCoordinate(2, 100000));
return _list;
}
}
但是,由於我無法直接實例化Coordinates類(因為其抽象),因此我試圖返回Coordinates列表並卡在“ YCoordinate”類的公共重寫函數中。 如何返回坐標列表? 如果我將IYCoordinate放入上述位置,則會發生相同的錯誤。
也許我的實現是完全錯誤的? 歡迎提出任何更好的建議。
稍后會有XCoordinate類,依此類推。 如果這種方法看起來有點像是因為我試圖擺脫這種理論的束縛。
這就是我要做的:
1)您有一個接口IYCoordinate
,但您也要擁有IXCoordinate
和IZCoordinate
。 只需使用單一的界面- ICoordinate
和一個功能- GetCoordinateList
:
interface ICoordinate
{
IList<Coordinates> GetCoordinateList();
}
實際上,如果您使用我的方法,則可以消除這種界面
2)在抽象類中,您將有一個不執行任何操作的GetCoordinateList
存根
public abstract class Coordinates: ICoordinate
{
public virtual List<Coordinates> GetCoordinateList()
{
throw new System.NotImplementedException();
}
}
實際上,您可以完全消除ICoordinate
接口,而僅使用抽象類。 很好
3)您將從該Coordinates
類派生一個(或多個)類,並根據需要實現GetCoordinate
public class YCoordinate : Coordinates
{
public override List<Coordinates> GetCoordinateList()
{
List<Coordinates> _list = new List<Coordinates>();
_list.Add(new YCoordinate(1, 5000));
_list.Add(new YCoordinate(2, 100000));
return _list;
}
}
因此,您只有一個接口和一個函數名,可以從Coordinates
派生的任何類中獲取坐標。 如果將來要添加XCoordinate
類,則需要使用相同的名稱實現相同的功能。 當您實例化XCoordinate
或YCoordinate
或WhateverCoordinate
類時,您將始終知道需要一個GetCoordinateList
函數
var coordClass = new XCoordinate();
coordClass.GetCoordinateList();
此外,當傳遞必須具有GetCoordinateList
成員的內容時,您可以在任意位置使用接口ICoordinate
或抽象類Coordinates。
在這些行上:
_list.Add(new IYCoordinate(1, 5000));
_list.Add(new IYCoordinate(2, 100000));
您需要實例化一個從Coordinates
類派生的類的對象。 在這里,您嘗試創建接口的新實例,但是您不能這樣做-接口成員沒有定義!
創建一個Coordinates
的子類,並實例化它。 (或者從此類的定義中刪除abstract
關鍵字-尚不清楚為什么它還是抽象的,因為沒有抽象成員。)
您至少需要一個具體的課程。
目前,您只有抽象類和接口。
簡單的答案....更改這兩行:
_list.Add(new IYCoordinate(1, 5000));
_list.Add(new IYCoordinate(2, 100000));
對此:
_list.Add(new YCoordinate(1, 5000));
_list.Add(new YCoordinate(2, 100000));
請注意,即時通訊在那里創建類,而不是接口。
長答案... Blablablaster正確地做到了這一點:-)
從Blablablaster答案開始-我認為您在這里不需要界面。
公共抽象類Coordinates {public int CoordinatePriority {get; 組; } public int Coordinate {get; 組; }
protected Coordinates(int CoordinatePriority, int Coordinate) { this.CoordinatePriority = CoordinatePriority; this.Coordinate = Coordinate; } public abstract List<Coordinates> GetCoordinateList();
}
如您所見,我創建了一個抽象方法,而不是接口中的方法。 每個派生類都必須實現此方法。
class YCoordinate:Coordinates
{
public YCoordinate(int CoordinatePriority, int Coordinate) :
base(CoordinatePriority, Coordinate) //Call constructor of baseclass
{
}
public override List<Coordinates> GetCoordinateList()
{
List<Coordinates> list = new List<Coordinates>();
list.Add(new YCoordinate(1, 5000));
list.Add(new YCoordinate(2, 100000));
return list;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.