请考虑以下情形:
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];
所以我的问题如下:
答案 0 :(得分:0)
1. Why won't the framework do an implicit cast for me, since the types are compatible?
嗯,类型不兼容。并非每个ClassA
都是ClassB
,因此当您从列表中检索ClassB
时,您需要明确指定要转发到ClassA
。
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
列表或任何扩展它的列表,那么您现在正在做的就是您需要做的事情。