[英]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.