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

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添加新判断,违反开闭原则。利用多态可以让代码更易维护:

  1. 修改父类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}");
    }
}
  1. 子类重写该方法:
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}");
    }
}
  1. 简化Method方法:
public static void Method(Vehicle thing)
{   
    thing.PrintDetails();
}

后续新增子类时,只需重写PrintDetails方法即可,无需修改Method,代码扩展性更强。

内容的提问来源于stack exchange,提问作者NotFromEnglandPerson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:38:49