You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 10:54:01