我有以下代码部分,我正在尝试实现一个返回列表的方法。我的结构如下:抽象类“坐标” - >公共类“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;
}
}
但是,我试图返回一个坐标列表并且卡在“YCoordinate”类中的公共覆盖函数上,因为我无法直接实例化Coordinates类(因为它的摘要)。如何返回坐标列表?如果我按照上面所示放入IYCoordinate,也会发生同样的错误。
也许我的实施完全错了?任何更好的建议都会受到欢迎。
稍后会有XCoordinate类等等。如果这种方法看起来有点像它,因为我试图理解这背后的理论。
答案 0 :(得分:1)
我就是这样做的:
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
或抽象类坐标。
答案 1 :(得分:0)
在这些方面:
_list.Add(new IYCoordinate(1, 5000));
_list.Add(new IYCoordinate(2, 100000));
您需要实例化一个派生自Coordinates
类的类的对象。在这里,您尝试创建一个新的接口实例,而您不能这样做 - 接口成员没有定义!
创建Coordinates
的子类并实例化它。 (或者从这个类的定义中删除abstract
关键字 - 不清楚为什么它是抽象的,因为没有抽象成员。)
答案 2 :(得分:0)
您至少需要一个具体的课程。
目前您只有抽象类和接口。
答案 3 :(得分:0)
简单的答案....改变这两行:
_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得到了正确答案: - )
答案 4 :(得分:0)
从Blablablaster回答 - 在我看来,你不需要这里的界面。
公共抽象类坐标 { 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;
}
}