簡體   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