首页 > 解决方案 > 从子继承访问抽象类成员

问题描述

我有一个名为 Flight 的抽象类,它实现了一个名为 IFlight 的接口,它有一个虚拟方法,另外三个继承自它的类,这三个类之间的唯一区别是这个方法的实现。我想做的另一件事是实现一个方法,该方法接受 IFlight 类型的对象(可能是这三个类之一)作为参数,并且我想从它们访问抽象类(Flight)的成员。有什么方法可以实现这样的事情?

航班:

class AbsFlight: IFlight
{ 
    public int ID { get; set; }

    public string Start_Point { get; set; }

    public virtual float Calculate_Price(float Base_Price)
    {
        return Base_Price;
    } 
}

其中一个类(其他两个看起来相似,除了方法“Calculate_Price”):

class Charter: AbsFlight
{
    public override float Calculate_Price(float Base_Price)
    {
        return base.Calculate_Price(Base_Price) * 3;
    }
}

主要的:

private static void Some_Method(IFlight flight)
{
    Console.WriteLine(flight.Calculate_Price(2)); //OK
    Console.WriteLine(flight.ID); //Error
}

static void Main(string[] args)
{
    List<IFlight> flights = new List<IFlight>();

    flights.Add(new Regular());
    flights.Add(new Charter());
    flights.Add(new LowCost());

    Main_SomeMethod(flights[0]);
}

标签: c#.net

解决方案


您的方法应该接受具有所需属性的类型,在本例中为AbsFlight类。

private static void Some_Method(AbsFlight flight)
{
    Console.WriteLine(flight.Calculate_Price(2)); 
    Console.WriteLine(flight.ID); //OK
}

但是假设该方法必须接受任何IFlight. 在这种情况下,它不能确定它收到了 AbsFlight;它必须检查。检查后,您可以进行施法。

private static void Some_Method(IFlight flight)
{
    Console.WriteLine(flight.Calculate_Price(2)); 
    if (flight is AbsFlight)
    {
        Console.WriteLine(((AbsFlight)flight).ID); //OK
    }
}

对于 c#7,如果您认为它更清晰,您可以使用一个额外的构造:

private static void Some_Method(IFlight flight)
{
    Console.WriteLine(flight.Calculate_Price(2)); 
    switch (flight)
    {
        case AbsFlight absFlight:
            Console.WriteLine(absFlight.ID); //OK
            break;
    }
}

推荐阅读