[英]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.