从泛型超类集合向下转换为子类
本文关键字:转换 子类 泛型 超类 集合 | 更新日期: 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];
所以我的问题如下:
- 既然类型是兼容的,为什么框架不为我做隐式强制转换?
- 由于您需要强制转换为特定类型,因此此操作不是一种拆箱类型吗?
- 与Object的向下映射相比,向下映射的成本是多少?
- 是否有更好/更有效的方法来存储/访问共享同一超类的子类?
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
中检索任何元素。此外,装箱是将值类型(如int
、char
等原语)转换为引用类型的行为,这里没有这样做,因此这里没有双重解封装。
3. What is the cost of the downcast as compared to a downcast from an Object?
它们可能具有完全相同的开销,因为ClassB
和ClassC
都是ClassA
和object
的子类。
4. Is there a better/more efficient way to store/access subclasses that share the same superclass?
。如果您想要存储ClassA
列表或任何扩展它的内容,那么您现在所做的正是您需要做的。