繁体   English   中英

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

[英]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 ,但您也要拥有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或抽象类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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM