代码之家  ›  专栏  ›  技术社区  ›  Mark A. Donohoe

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

  •  3
  • Mark A. Donohoe  · 技术社区  · 7 年前

    想想这个虚构的例子。。。

    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. 我得重复一遍多余的 在泛型中
    2. 兄弟姐妹
    3. 我必须通过一个 兄弟姐妹

    为了解决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 , 自我 . 不需要传递冗余类型参数。

    0 回复  |  直到 7 年前