2013-04-29 101 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