c# - 多态重载——为了重载参数,如何将抽象类型强制为 "act"作为其派生类型之一?

标签 c# polymorphism overloading

DoSomething(Car car);
DoSomething(Bike bike);

public class Car : Vehicle {}
public class Bike : Vehicle {}
public abstract class Vehicle {}


void run(Vehicle vehicle) {
    DoSomething(vehicle);
}

这感觉像是一个简单的问题,但我遇到了问题。 DoSomething(Vehicle vehicle) 不存在,因此 DoSomething(vehicle) 会抛出错误,即使 vehicle 被“保证”为 Car 或 Bike。我如何才能让编译器相信“车辆”是自行车或汽车,以便可以运行 DoSomething?

当然我也可以有另一种方法

DoSomething(Vehicle vehicle)
{
    if(vehicle is Car) ... etc
}

但肯定有更清洁的方法吗?

编辑/清晰度

将此代码放在管理器类中而不是在 Vehicle 类中存在 DoSomething() 的动机是每个 Vehicle 需要访问程序的不同部分。例如:

DoSomething(Car car) {
    motorwayInfo.CheckMotorwayStatus();
}
DoSomething(Bike bike) {
    cycleInfo.CheckCyclePathStatus();
}

不确定这个类比是否真的很好地解决了我的特定问题,哈哈 - 但基本上我不希望 Car 有任何对 cycleInfo 的引用,也不希望 Bikes 有任何对 motorWayInfo 的引用。但是,将 DoSomething 放入 Vehicle 基本上意味着它的参数需要是:

DoSomething(CycleInfo cycleInfo, MotorwayInfo motorwayInfo)

DoSomething(InfoManager infoManager)

这两者似乎都不理想,因为我知道每个子类型只会使用一个特定的信息对象。我这样做是不是错了?

最佳答案

这里真正的问题是 - 您希望 方法的参数发生什么?如果那个,不管它是什么,取决于参数的具体(子)类型,那么该行为的适当位置是在参数基类的虚拟(甚至抽象)成员中 - Vehicle .

class Vehicle
{
    public abstract void Behave();
}

class Car : Vehicle
{
    public override void Behave()
    {
        // Do something specific to a car
    }
}

class Bike : Vehicle
{
    public override void Behave()
    {
        // Do something specific to a bike
    }
}
...
void Run(Vehicle vehicle)
{
    vehicle.Behave();
}

正如您从这段代码中看到的,我已经还原了角色。 Run 函数负责了解具体参数的行为方式。相反,作为 Vehicle 参数传递的每个具体对象都必须知道如何表现。这就是正确的多态性。

关于 Run 方法,它关于参数的所有职责都应该与所有参数对象的公共(public)类型相关,即基类 Vehicle。在这方面,该方法可以访问在基类上定义的成员,或将对象插入集合等。

void Run(Vehicle vehicle)
{
    vehicle.Behave();

    List<Vehicle> list = ...
    list.Add(vehicle);
}

关于c# - 多态重载——为了重载参数,如何将抽象类型强制为 "act"作为其派生类型之一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48975551/

相关文章:

Java 传递变量时的多态性。

c++ - 两个版本的函数可以重载,常量成员函数和不带 const 的函数

c - 使用 pow 函数时了解什么是函数重载概念

java - 在 Java 中重载私有(private)方法

C# 程序使用我的 Windows AD 身份验证连接到我的数据库,而不是我编码到其中的连接字符串。为什么?

c# - 如何在代码中将 DataGrid 的数字列向右对齐?

c# - 有没有理由我不应该从 C# 开始

c# - 多态方法仅调用一次时运行两次

oop - 为什么这个子类的父方法调用不是多态的?

C# AppDomains 和线程