簡體   English   中英

如何將自定義通用接口實現與私有類型一起使用?

[英]How can I use a custom generic interface implementation with private types?

假設我要指定在類中使用哪種通用接口實現。 如果該類使用它來存儲另一個公共類型,則這很簡單(如果有點難看):

class Foo<T> where T : IList<Bar>, new()
{
    private T _list = new T();
}
class Bar{}

然后,我們可以像這樣創建foo的新實例: new Foo<List<Bar>>()

但是Bar發生了什么是Foo一個私有類:

class Foo<T> where T : IList<Bar>, new()
{
    private T _list = new T();
    class Bar{}
}

顯然,這失敗了,因為Foo無法在其類型約束中公開Bar ,並且無法實例化new Foo<List<Bar>>()

我可以堅持暴露object

class Foo<T> where T : IList<object>, new()
{
    private T _list = new T();
    class Bar{}
}

但是,每次使用接口時,我都會從object投射到Bar

我最好的選擇是什么?

private的目的是僅允許同一類中的代碼進行訪問。 只是您嘗試做的是不正確的。 更好地根據您的要求將private更改為其他訪問修飾符。

如何在Foo類中公開第二個類型參數,從而公開集合的實例類型,例如:

class Foo<TList, TItem> where TList : IList<TItem>, new()
{
    private IList<TItem> _list = new TList();

    public Foo()
    {
    }


    public void Add(TItem item)
    {
        _list.Add(item);
    }
}

然后做一個具體的課程來像

class BarFoo : Foo<List<BarFoo.Bar>, BarFoo.Bar>
{
    class Bar { }
}

我會說您最好的選擇是:

class Foo
{
    private List<Bar> _list = List<Bar>();
    class Bar{}
}

我可以使Foo成為包裝某些私有嵌套類列表的泛型類的唯一原因是,如果您有一個帶有Bar繼承者的私有嵌套類層次結構。 而且,如果是這種情況,您可以公開某種工廠方法,該方法帶有一個必要的參數來告訴Foo哪些子類客戶想要。 如果將列表的類型和列表的類型都保留為私有,則將類的公共API設為通用是沒有意義的,IMO。 您要求客戶提供一種他們無法訪問或無法控制的類型。

暫無
暫無

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

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