2013-04-29 103 views
0

我有以下代码段,我试图实现一个返回列表的方法。我的结构如下:抽象类“坐标” - >公共类“YCoordinate”与我的界面指向“YCoordinate”。我不希望我的接口直接与我的抽象类聊天,因为我觉得我的抽象类的实现负责工作。在C中使用抽象类,接口和列表#

接口:

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; 
    } 
} 

不过,我想返回坐标列表并在“YCoord”中卡住公共覆盖功能inate“类,因为我无法直接实例化坐标类(因为它的摘要)。我怎样才能返回坐标列表?如果我如上所示放入IYCoordinate,则会发生同样的错误。

也许我的实现是完全错误的?任何建议如果做得更好,都会受到欢迎。

稍后会有XCoordinate类等。如果这种方法看起来有点像它,那是因为我试图理解背后的理论。

+0

'IYCoordinate.GetYCoordinateList()'应该返回'的IList ','没有列出'。 – cdhowie 2013-04-29 19:22:45

+0

@cdhowie编译器不需要将接口作为接口中定义的方法的返回结果返回。出于设计和体系结构的原因,您可能会选择这样做,但是,由OP编写的接口定义在这里不是问题。 IMO YCoordinate班有缺陷,因为它拥有自己的列表。这将会更好地归于另一个班级。 OP的例子有点令人困惑。 – CodeMonkeyKing 2013-04-29 20:35:09

+0

@CodeMonkeyKing我从来没有说过,编译器会抱怨。我的意见旨在灌输良好的设计实践,而不是指出错误。 – cdhowie 2013-04-29 21:37:22

回答

1

这是我会怎么做:

1)你有一个接口 - IYCoordinate,但你说你会希望有IXCoordinateIZCoordinate了。只需使用单一的界面 - ICoordinate和一个功能 - GetCoordinateList

interface ICoordinate 
{ 
    IList<Coordinates> GetCoordinateList(); 
} 

其实,这intefrace可以消除,如果您使用我的方法

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或抽象类坐标,无论你喜欢。

+0

在你说IList的界面中,我只是改变了它,因为它是在抱怨它。以为我可以保留IList并在抽象类中改变函数等等。然而,我仍然对步骤nr 3感到困惑。你说新的清单,然后在下一行讨论YCoordinates?如果我把它作为Y坐标,它会抱怨这两个参数没有构造函数。自摘要以来,我无法将其更改为坐标。 – Sonja 2013-04-29 20:09:00

+0

我将所有构造函数从抽象类移到YCoordinate,而现在它的工作。然而,我希望不要在每个类的实现中都键入类型,但是现在我正在按照之前的建议去做具体的类。 – Sonja 2013-04-29 20:19:18

+0

谢谢你,这是一个更优雅的解决方案:) – Sonja 2013-04-29 20:21:09

0

在这些线路上:

_list.Add(new IYCoordinate(1, 5000)); 
_list.Add(new IYCoordinate(2, 100000)); 

您需要实例从Coordinates类派生的类的对象。这里你试图创建一个接口的新实例,而你不能这么做 - 接口成员没有定义!

创建的Coordinates一个子类,实例化来代替。 (或从这个类的定义中删除abstract关键字 - 目前尚不清楚它为什么是抽象的,因为没有抽象成员。)

+0

Tx ...我错过了将抽象类中的方法改为公共抽象列表 GetYCoordinateList();现在试试看看你的其他建议。 – Sonja 2013-04-29 19:37:04

+0

看起来你想创建一个'YCoordinate'的实例,所以试试'new YCoordinate'而不是'new YICoordinate'。 – cdhowie 2013-04-29 19:37:52

0

您至少需要一个具体类。

目前你只有抽象类和接口。

+0

我现在明白了,忙着看着cdhowie下面的建议 – Sonja 2013-04-29 19:38:35

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得到了一个正确的:-)

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; 
    } 
} 
+0

谢谢你,我现在要玩这个。使用接口的原因是因为我正在学习如何正确地实现接口和摘要,但我了解它并不总是必须使用它们,或者完全取决于场景。 – Sonja 2013-04-29 20:37:48