C# 向上转型/多态性问题
C# Upcasting / Polymorphism Issue
我认为这个问题很基础,但我找不到这个问题的答案。在 C# 中,假设我有 3 个 classes:A, B, C
B 派生自 A
C 派生自 B
现在,如果我想要一个 class A 类型对象的列表或数组,但希望该数组能够容纳 B 和 C 类型的对象,这没问题...我可以做一些事情像这样:
A[] myArrayofAtypes;
但是假设我将此数组的第一个元素设为 C 类型。如果类型 C 在其 class 定义中定义了一个变量,该变量仅存在于 class C 的 class 中定义...如何从数组中访问该变量?我不能只做 A[0].MyVariableGetter
,因为基数 class、A.
中不存在该变量
有什么建议吗?
你必须向下转换它:
C c = (C)myArrayofAtypes[0];
var v = c.MyVariableGetter;
您必须将其强制转换为类型 c 并访问该成员。
If (arr[i] is c)
{
((C)arr[0]).member = value;
}
我会使用这些漂亮的 C# 运算符,而不是像 'king.code' 建议的那样进行转换,它们是 'is' 和 'as'.
public void CallIfTypeC(A a)
{
if (a is C)
{
C c = a as C;
c.DoAction();
}
}
我认为这个问题很基础,但我找不到这个问题的答案。在 C# 中,假设我有 3 个 classes:A, B, C
B 派生自 A
C 派生自 B
现在,如果我想要一个 class A 类型对象的列表或数组,但希望该数组能够容纳 B 和 C 类型的对象,这没问题...我可以做一些事情像这样:
A[] myArrayofAtypes;
但是假设我将此数组的第一个元素设为 C 类型。如果类型 C 在其 class 定义中定义了一个变量,该变量仅存在于 class C 的 class 中定义...如何从数组中访问该变量?我不能只做 A[0].MyVariableGetter
,因为基数 class、A.
有什么建议吗?
你必须向下转换它:
C c = (C)myArrayofAtypes[0];
var v = c.MyVariableGetter;
您必须将其强制转换为类型 c 并访问该成员。
If (arr[i] is c)
{
((C)arr[0]).member = value;
}
我会使用这些漂亮的 C# 运算符,而不是像 'king.code' 建议的那样进行转换,它们是 'is' 和 'as'.
public void CallIfTypeC(A a)
{
if (a is C)
{
C c = a as C;
c.DoAction();
}
}