簡體   English   中英

泛型和繼承 - 方法args

[英]Generics and inheritance - method args

我用方法Add寫了數據結構LinkedList:

public class LinkedList<T>
    {
        private Element<T> first;
        private Element<T> last;

        public bool Add(Element<T> element)
        { 
        ...

我還定義了三個類:

public class Element<T> : IDisposable
public class ElementString : Element<string>, ICloneable    
public class ElementLong : Element<long>, ICloneable

當我想在main方法中做這樣的事情時:

LinkedList<ElementLong> test = new LinkedList<ElementLong>();
ElementLong elem1 = new ElementLong();
test.Add(elem1);

我得到錯誤,方法添加“有一些無效的參數”。 如何解決這個問題? 謝謝您的幫助。

當你寫作

LinkedList<ElementLong>

您將T定義為ElementLong Add方法需要一個Element<T> ,在本例中是

Element<ElementLong>

如果您希望列表只允許long s,您可以使用:

LinkedList<long> test = new LinkedList<long>();
ElementLong elem1 = new ElementLong();
test.Add(elem1);

此外,可能不需要元素派生類,您可以直接使用基類:

var test = new LinkedList<long>();
var elem1 = new Element<long>();
test.Add(elem1);

您應該將鏈表的泛型類型參數保持為實際類型:

LinkedList<long> test = new LinkedList<long>();

ElementLong elem1 = new ElementLong();
test.Add(elem1);

由於ElementLong實際上是一個Element<long>這將起作用。

如果你仍然得到它, LinkedList<ElementLong>將期望Element<ElementLong>作為參數:)

就這個界面而言:

LinkedList<ElementLong> test = new LinkedList<ElementLong>();

很可能等於這個:

LinkedList<Element<long>> test = new LinkedList<Element<long>>();

類型參數T等於Element<long>> 這意味着您的add方法有效地具有簽名:

public bool Add(Element<Element<long>> element)

但是您提供的參數的類型為Element<long>而不是Element<Element<long>> 您應該聲明列表的泛型類型T等於long ,這是列表中要保留的元素類型。

我懷疑Element類是否應該是可訪問的(公共)。

其他人提到您的問題是您的泛型類型是ElementLong ,因此Add方法需要Element<ElementLong>的值。 但我還要說你應該考慮改變你的Add方法的簽名,只取一個T的值。

public class LinkedList<T>
{
    private Element<T> first;
    private Element<T> last;

    public bool Add(T value)
    { 
    ...

LinkedList<long> test = new LinkedList<long>();
test.Add(0);

這更符合其他通用集合的工作方式。 您也可以考慮實現IList<T>接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM