C#中如何从IFlight类型实例访问抽象类AbsFlight的成员
问题原因
你遇到的报错是因为IFlight接口的契约定义中仅包含Calculate_Price方法,没有声明ID、Start_Point属性。C#作为静态类型语言,接口类型的变量只能访问接口自身明确定义的成员,即使运行时实际指向的是AbsFlight子类实例,编译期也不允许直接访问接口未定义的成员。
可用解决方案
- 方案1:补全
IFlight接口成员定义(最推荐)
如果所有实现IFlight的类都需要包含ID、Start_Point属性,直接将这两个属性补充到接口定义中即可,符合面向接口的设计规范,原有调用代码无需修改:
interface IFlight { int ID { get; set; } string Start_Point { get; set; } float Calculate_Price(float Base_Price); }
- 方案2:修改入参类型为
AbsFlight
如果你的业务场景中所有IFlight的实现类都继承自AbsFlight,没有其他独立实现接口的类,可以直接将方法入参和集合的类型从IFlight改为AbsFlight,直接就能访问抽象类中定义的所有公共成员:
// 修改方法入参 private static void Some_Method(AbsFlight flight) { Console.WriteLine(flight.Calculate_Price(2)); Console.WriteLine(flight.ID); // 正常运行 } // 对应修改集合类型 List<AbsFlight> flights = new List<AbsFlight>();
- 方案3:运行时类型转换后访问
如果你无法修改接口定义和入参类型,可以在方法内先做类型校验,转换为AbsFlight类型后再访问成员,避免转换异常:
private static void Some_Method(IFlight flight) { Console.WriteLine(flight.Calculate_Price(2)); // 模式匹配校验类型后访问 if (flight is AbsFlight absFlight) { Console.WriteLine(absFlight.ID); } }
该方案仅适合临时兼容场景,不建议作为常规实现,会额外增加类型校验开销,也违背了面向接口编程的设计初衷。
内容的提问来源于stack exchange,提问作者ValeriF21
相关产品推荐
相关产品推荐

