从泛型超类集合向下转换为子类

本文关键字:转换 子类 泛型 超类 集合 | 更新日期: 2023-09-27 18:17:11

考虑以下场景:

public abstract class ClassA
{
    public void SomeMethod();
}
public class ClassB : ClassA
{
    public void MethodForClassB()
    {
    }
}
public class ClassC : ClassA
{
    public void MethodForClassC()
    {
    }
}
public static void Main(string[] args)
{
    var classAList = new List<ClassA>();
    classAList.Add(new ClassB());
    classAList.Add(new ClassC());
}

现在如果我想这样做:

ClassB retrievedClass = List[0];

所以我可以在ClassA的子类上执行一个方法,编译器强制我向下转换到一个特定的子类类型:

ClassB retrievedClass = (ClassB) List[0];

所以我的问题如下:

  1. 既然类型是兼容的,为什么框架不为我做隐式强制转换?
  2. 由于您需要强制转换为特定类型,因此此操作不是一种拆箱类型吗?
  3. Object的向下映射相比,向下映射的成本是多少?
  4. 是否有更好/更有效的方法来存储/访问共享同一超类的子类?

从泛型超类集合向下转换为子类

1. Why won't the framework do an implicit cast for me, since the types are compatible?

类型不兼容。并非每个ClassA都是ClassB,因此您需要明确指定,当您从列表中检索ClassA时,您希望向下转换为ClassB

2. Isn't this operation a type of unboxing since you need to cast to a specific type?

嗯,没有。这里没有进行任何开箱操作,因为您从未从classAList中检索任何元素。此外,装箱是将值类型(如intchar等原语)转换为引用类型的行为,这里没有这样做,因此这里没有双重解封装。

3. What is the cost of the downcast as compared to a downcast from an Object?

它们可能具有完全相同的开销,因为ClassBClassC都是ClassAobject的子类。

4. Is there a better/more efficient way to store/access subclasses that share the same superclass?

。如果您想要存储ClassA列表或任何扩展它的内容,那么您现在所做的正是您需要做的。