C#如何从基类对象访问派生类属性及派生类创建疑问
问题解决方法
一、派生类创建是否正确?
你的Car和Bike继承Vehicle的写法完全符合C#类继承的规范,是正确的。子类可以继承父类的公共/受保护成员,同时扩展自身专属属性。
二、如何访问子类专属属性?
当前Method方法接收的是Vehicle类型参数,编译器仅识别它为父类类型,无法直接访问子类属性,以下是几种常用解决方案:
1. 显式类型转换
先判断对象类型,再强制转换为子类后访问属性:
public static void Method(Vehicle thing) { if (thing is Car) { Car car = (Car)thing; Console.WriteLine(car.Plate); Console.WriteLine(car.Color); } if (thing is Bike) { Bike bike = (Bike)thing; Console.WriteLine(bike.HasRingBell.ToString()); Console.WriteLine(bike.Color); } }
2. is模式匹配(C# 7.0+)
这是更简洁的写法,判断类型的同时完成转换:
public static void Method(Vehicle thing) { if (thing is Car car) { Console.WriteLine(car.Plate); Console.WriteLine(car.Color); } if (thing is Bike bike) { Console.WriteLine(bike.HasRingBell.ToString()); Console.WriteLine(bike.Color); } }
3. as关键字
转换失败时会返回null,适合需要处理转换失败场景的情况:
public static void Method(Vehicle thing) { Car car = thing as Car; if (car != null) { Console.WriteLine(car.Plate); Console.WriteLine(car.Color); } Bike bike = thing as Bike; if (bike != null) { Console.WriteLine(bike.HasRingBell.ToString()); Console.WriteLine(bike.Color); } }
三、更优雅的OOP方案:多态
上面的写法虽能解决问题,但后续新增Vehicle子类(如Truck)时,需不断修改Method添加新判断,违反开闭原则。利用多态可以让代码更易维护:
- 修改父类
Vehicle,添加虚方法:
public class Vehicle { public bool HasWheels { get; set; } public bool RunsOnGas { get; set; } // 定义虚方法,子类重写实现自身逻辑 public virtual void PrintDetails() { Console.WriteLine($"Has Wheels: {HasWheels}, Runs On Gas: {RunsOnGas}"); } }
- 子类重写该方法:
public class Car : Vehicle { public string Color { get; set; } public string Plate { get; set; } public override void PrintDetails() { base.PrintDetails(); // 可选:调用父类的基础输出逻辑 Console.WriteLine($"Car Color: {Color}, Plate: {Plate}"); } } public class Bike : Vehicle { public string Color { get; set; } public bool HasRingBell { get; set; } public override void PrintDetails() { base.PrintDetails(); Console.WriteLine($"Bike Color: {Color}, Has Ring Bell: {HasRingBell}"); } }
- 简化
Method方法:
public static void Method(Vehicle thing) { thing.PrintDetails(); }
后续新增子类时,只需重写PrintDetails方法即可,无需修改Method,代码扩展性更强。
内容的提问来源于stack exchange,提问作者NotFromEnglandPerson
相关产品推荐
相关产品推荐

