想想这个虚构的例子。。。
public abstract class CollectionItem<TSelf> {
protected CollectionItem(ICollection<TSelf> siblings)
=> Siblings = siblings;
public ICollection<TSelf> Siblings { get; }
}
public class Foo : CollectionItem<Foo>{
public Foo()
: base(new FooCollection){}
}
public class FooCollection : ObservableCollection<Foo>{
}
有了以上这些,
Foo
Siblings
财产。然而,这有三个问题。
-
我得重复一遍多余的
福
在泛型中
-
兄弟姐妹
-
我必须通过一个
兄弟姐妹
为了解决2和3,我做了这个改变。。。
public class CollectionItem<TSelf, TSiblings>
where TSiblings : ICollection<TSelf>, new() {
protected CollectionItem()
=> Siblings = new TSiblings();
public TSiblings Siblings { get; }
}
但我还是要把那些看起来多余的
福
作为第一个类型参数,像这样。。。
public class Foo : CollectionItem<Foo, FooCollection>{
}
Self
始终表示当前实例类型的数据类型,这意味着
自我
在C里有这个可以让我做这样的事情。。。
public class CollectionItem<TSiblings>
where TSiblings : ICollection<Self>, new() { // Note it uses 'Self' here
protected CollectionItem()
=> Siblings = new TSiblings();
public TSiblings Siblings { get; }
}
public class Foo : CollectionItem<FooCollection>{
}
public class Laa : CollectionItem<LaaCollection>{
}
在上面的例子中
福
自我
指
. 例如
Laa
,
自我
指
. 不需要传递冗余类型参数。