如何实现支持多类型的数组?子类成员访问问题求助
解决基类数组访问子类成员的问题
你用BaseClass[]数组存储子类实例时,编译器默认只把数组元素识别为BaseClass类型,所以直接访问不了ChildClass1的b或ChildClass2的c。下面是几种可行的解决方法:
1. 显式强制转换(确定类型时用)
如果能确定数组中某个元素是特定子类的实例,可以直接强制转换类型,之后就能访问子类成员。不确定类型时建议先做检查,避免抛出异常。
// 假设array[0]是ChildClass1的实例 ChildClass1 child1 = (ChildClass1)array[0]; Console.WriteLine(child1.b); // 不确定类型时先检查 if (array[1] is ChildClass2) { ChildClass2 child2 = (ChildClass2)array[1]; Console.WriteLine(child2.c); }
2. 使用as关键字安全转换
as关键字转换失败时会返回null,不会抛出异常,适合不确定元素类型的场景:
ChildClass1 c1 = array[0] as ChildClass1; if (c1 != null) { Console.WriteLine(c1.b); } ChildClass2 c2 = array[1] as ChildClass2; if (c2 != null) { Console.WriteLine(c2.c); }
3. 模式匹配(C# 7.0及以上版本支持)
这是更简洁的写法,能在条件判断中同时完成类型检查和变量赋值:
foreach (var item in array) { if (item is ChildClass1 child1) { Console.WriteLine(child1.b); } else if (item is ChildClass2 child2) { Console.WriteLine(child2.c); } }
4. 利用多态(面向对象推荐方案)
如果子类的特有成员操作有共性,可以在基类中定义虚方法或抽象方法,让子类重写。这样不用转换类型,直接调用方法就能自动执行子类的逻辑,更符合面向对象设计原则:
先修改类结构:
public class BaseClass { int a; // 定义虚方法,子类可重写 public virtual void ShowInfo() { Console.WriteLine($"基类成员a:{a}"); } } public class ChildClass1 : BaseClass { string b; public override void ShowInfo() { Console.WriteLine($"子类1成员b:{b}"); } } public class ChildClass2 : BaseClass { string c; public override void ShowInfo() { Console.WriteLine($"子类2成员c:{c}"); } }
使用时直接调用方法:
foreach (var item in array) { item.ShowInfo(); // 自动调用对应子类的重写方法 }
内容的提问来源于stack exchange,提问作者Gustabala
相关产品推荐
相关产品推荐

