C# 非泛型超类型的泛型子类

时间:2021-01-08 13:12:37

标签: c# generics subclass

我正在尝试添加一个类型安全的泛型容器作为非泛型超类型的子类型。

它是用于编译器但为了说明,让我将其作为车辆部件呈现。您有一个根类 VehiclePart,其中您可以拥有普通的子类型(例如此处的变速杆),但 Apart 也可以包含子部分(例如此处的 PartContainer),我想一般地执行此操作以确保编译器检查的类型安全。

代码如下。它在 newpc.Add();return newpc;

失败

我的问题是

  • 这可能吗,并且

  • 这是否可取?

泛化一个闻起来很糟糕的子类型有一些不对称的地方。我从一个常见的超类 VehiclePart 继承了这些,因为它应该使处理它们更加一致(如果它无论如何都可以工作。我对泛型比较菜)但感觉不对。< /p>

public abstract class VehiclePart {
    public abstract T cloneTypesafe<T>() 
                    where T : VehiclePart, new();
}


public class Gearstick : VehiclePart {

    public Gearstick() { }

    public override T cloneTypesafe<T>() {
        return new T();
    }
}


public class PartContainer<T> : VehiclePart 
                where T : PartContainer<T>, new() {
    private List<T> contents;

    public PartContainer() { 
        contents = new List<T>();
    }

    public virtual void Add<U>(U newItem) 
                            where U : T  { 
        contents.Add(newItem);
    }

    public override U cloneTypesafe<U>()
                        //  where U : T  it doesn't like this
        {
        PartContainer<T> newpc = new PartContainer<T>();
        foreach (var kid in contents) {
            newpc.Add<U>(kid.cloneTypesafe<U>());
        }
        return newpc;
    }


编辑:我做错了。以下代码似乎符合我的要求,但我对此感到不舒服,因为我觉得我没有完全理解它。

    public class PartContainer2<K> : VehiclePart
                where K : VehiclePart, new() {
        private List<K> contents;

        public PartContainer2() {
            contents = new List<K>();
        }

        public virtual void Add(K newItem) {
            contents.Add(newItem);
        }

        public PartContainer2<K> cloneTypesafe() {
            PartContainer2<K> newpc = new PartContainer2<K>();
            foreach (var kid in contents) {
                newpc.Add(kid.cloneTypesafe<K>());
            }
            return newpc;
        }

    }

0 个答案:

没有答案
相关问题