簡體   English   中英

抽象類—如何指定返回通用列表

[英]Abstract Class — How to specify return of generic list

我對此有些困難。 我有一個抽象類,我想為其繼承者添加一個公共抽象方法。 面臨的挑戰是該方法應返回實現完全不同的抽象類(NotifyingDatabaseObject)的類的通用列表。

我想執行以下操作,但無法編譯:

public abstract IList<T> GetList(int? id) where T : NotifyingDatabaseObject;

而且,當然,如果我將“ T”替換為“ NotifyingDatabaseObject”,它將要求繼承的類返回該抽象類,而不是具體的抽象類。

關於如何實現此目標的任何方向?

謝謝!

如果返回的類型與抽象類或具體類無關,則可以在方法上使用類型參數,例如:

public abstract IList<T> GetList<T>(int? id) where T : NotifyingDatabaseObject;

具體的類如下所示:

class MyConcreteClass : MyAbstractClass
{
    public override IList<NotifyingDatabaseObjectChildClass> GetList<NotifyingDatabaseObjectChild>(int? id)
    {
        return new List<NotifyingDatabaseObjectChildClass>();
    }
}

我假設您希望基類的每個子類都返回NotifyingDatabaseObject特定子類型。 在這種情況下,您應該在基類中添加一個類型參數,並讓每個子類型指定它們返回的NotifyingDatabaseObject子類型:

public abstract class MyAbstractClass<T>
    where T : NotifyingDatabaseObject
{
    public abstract IList<T> GetList(int? id) ;
}

public class MyConcreteClass : MyAbstractClass<NotifyingDatabaseObjectChildClass>
{
    public override IList<NotifyingDatabaseObjectChildClass> GetList(int? id)
    {
        return new List<NotifyingDatabaseObjectChildClass>();
    }
}

請注意,現有答案不會這樣做-它要求每個子類型都支持返回NotifyingDatabaseObject任何子類型的列表,而不僅僅是返回一個子列表。 在這種情況下,唯一可能的實現是返回一個空列表(或為null,或者引發異常,或者無限循環),因為實現類沒有構造T類型值的通用方法。

暫無
暫無

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

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