【问题标题】:Check if the instance is type of base class or derived class after keyword 'as'?在关键字'as'之后检查实例是基类还是派生类?
【发布时间】:2021-01-11 13:23:38
【问题描述】:

请看下面的代码:

// Base class
public abstract class Aircraft
{
    public virtual void Fly()
    {
        Console.WriteLine("Aircraft flies");
    }
}

// Derived class
public class Plane : Aircraft
{
    public new void Fly()
    {
        Console.WriteLine("Plane flies");
    }
}

// Execution
public class Program
{
    public static void Main()
    {
        var lPlane = new Plane();
        Console.WriteLine(lPlane.GetType()); // Plane
        lPlane.Fly(); // Plane flies

        var lAircraft = lPlane as Aircraft;
        Console.WriteLine(lAircraft.GetType()); // Plane
        lAircraft.Fly(); // Aircraft flies
    }
}

以下行将Plane 转换为Aircaft

var lAircraft = lPlane as Aircraft;

所以我希望lAircraft 现在是Aircraft 的类型。但事实并非如此。它的类型为Plane

Console.WriteLine(lAircraft.GetType()); // Plane

通过关键字as进行强制转换后,如何判断当前实例是基类还是派生类?

【问题讨论】:

  • 你不能改变一个对象的运行时类型;强制转换只会改变编译时类型。

标签: c# .net oop inheritance polymorphism


【解决方案1】:

这段代码:

var lAircraft = lPlane as Aircraft;

会编译成这样:

Aircraft aircraft = lPlane;

这意味着这里的as 关键字什么也不做,因为您无法将派生类转换为它的基类。要了解更多信息,您可以阅读此答案:https://stackoverflow.com/a/8329517/2946329

【讨论】:

  • lAircraft.Fly(); // 飞机飞行
  • @Simon 你已经创建了Aircraft 的一个新实例,所以是的,它确实会打印飞机飞行,但是lPlane 的类型仍然是飞机,因为正如我所说的,你不能将其转换为它的基类。
猜你喜欢
  • 1970-01-01
  • 2023-03-19
  • 2012-07-03
  • 2019-03-02
  • 1970-01-01
  • 2014-04-27
  • 2017-07-04
  • 2013-05-03
  • 2018-10-18
相关资源
最近更新 更多