在C#中使用抽象类,接口和List

时间:2013-04-29 19:20:54

标签: c# interface abstract

我有以下代码部分,我正在尝试实现一个返回列表的方法。我的结构如下:抽象类“坐标” - >公共类“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类等等。如果这种方法看起来有点像它,因为我试图理解这背后的理论。

5 个答案:

答案 0 :(得分:1)

我就是这样做的:

1)你有一个界面 - IYCoordinate,但你说你也希望拥有IXCoordinateIZCoordinate。只需使用单一界面 - 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类,则需要使用相同的名称实现相同的功能。 当您要实例化XCoordinateYCoordinateWhateverCoordinate课程时,您将始终知道您需要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;
    }
}