是否可以使用泛型中的“this”类型作为约束本身?

2024-04-11

考虑这个虚构的例子......

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财产。然而,这存在三个问题。

  1. 我必须重复多余的Foo在一般情况下
  2. Siblings它本身不是实际集合类型的类型,而是接口的类型。
  3. 我实际上必须传递一个实例Siblings收藏

解决#2和#3,我做了这个改变......

public class CollectionItem<TSelf, TSiblings>
where TSiblings : ICollection<TSelf>, new() {

    protected CollectionItem()
        => Siblings = new TSiblings();

    public TSiblings Siblings { get; }
}

但我还是要传入看似多余的Foo作为第一个类型参数,像这样......

public class Foo : CollectionItem<Foo, FooCollection>{

}

在 Swift 中,你有一个隐式的Selfdatatype 始终表示当前实例的类型,这意味着如果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>{

}

在上面的例子中,Foo, Self指的是Foo。对于以下实例Laa, Self指的是Laa。无需传递多余的类型参数。

那么C#有类似的东西吗?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以使用泛型中的“this”类型作为约束本身? 的相关文章

随机推荐