簡體   English   中英

帶有列表的 C# 泛型

[英]C# Generics with Lists

我有這兩個類的多個版本:

public class Contests : List<Contest> { }

public class Contest {

    // stuff specific to Contest;       

    public Contests parent;

    public void Attach() {
        parent.Add(this);
    }
}

這是另一個:

public class Transactions : List<Transaction> { }

public class Transaction {

    // stuff specific to Transaction;       

    public Transactions parent;

    public void Attach() {
        parent.Add(this);
    }
}

為了不重復代碼,我可以使用泛型將 Attach 取出到基類中嗎?

public class MBData<T> {

    public T parent;

    public void Attach() {
        T.Add(this);
    }
}

我試着用下面的,但我收到有關不能夠轉換之間的誤差ContestsMBDatas<MBData<Contests>>

public class MBDatas<S> : List<S> { }

public class MBData<B> where B : MBDatas<MBData<B>> { }

public class Contests : MBDatas<Contest> { }

public class Contest : MBData<Contests> { }

這對你有用嗎?

public abstract class MBData<P, C>
    where P : MBDatas<P, C>
    where C : MBData<P, C>
{
    public void Attach()
    {
        this.Parent.Add((C)(object)this);
    }
    public P Parent { get; set; }
}

public abstract class MBDatas<P, C> : List<C>
    where P : MBDatas<P, C>
    where C : MBData<P, C>
{ }

你被迫做一個討厭的雙重轉換(C)(object)this來讓Attach方法工作,這是這種方法的唯一問題。 它有效,但您需要注意正確定義子類。

你可以這樣定義你的類:

public class Contests : MBDatas<Contests, Contest> { }
public class Contest : MBData<Contests, Contest> { }
public class Transactions : MBDatas<Transactions, Transaction> { }
public class Transaction : MBData<Transactions, Transaction> { }

最后,像這樣使用它們:

var cs = new Contests();
var c1 = new Contest() { Parent = cs };
var c2 = new Contest() { Parent = cs };

cs.Add(c1);
cs.Add(c2);

var ts = new Transactions();
var t1 = new Transaction() { Parent = ts };
var t2 = new Transaction() { Parent = ts };

ts.Add(t1);
ts.Add(t2);

暫無
暫無

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

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