java - 避免 instanceof 和 cast,一个 Super Class 可以知道 children 类吗?

标签 java polymorphism instanceof

我有这种使用 instanceof 和 cast 的代码,我想避免使用它们:

class Vehicle {}

class Boat extends Vehicle {
    getFloating()
}

class Car extends Vehicle{
    getWheels()
}

class UseVehicle{
    void useVehicleAsCar(Vehicle vehicle){ 
// this method cant be change its parameter Vehicle, of course ;D

        if (vehicle instanceof Car){
           ((Car)vehicle).getWheels() 
        }
    }
}

解决方法如下:

abstract class Vehicle {
    Car asCar(){return null;}
    Boat asBoat(){return null;}
}

class Boat extends Vehicle {
    getFloating(){};
    Boat asBoat(){return this};

}

class Car extends Vehicle{
    getWheels(){}
    Car asCar(){return this;}
}

class UseVehicle{
    void useVehicleAsCar(Vehicle vehicle){ 
// accept in exemple that object param is an instance of Car

        vehicle.asCar().getWheels(); 
    }
}

但是现在车辆类知道 child ....如果我想有一个总线类我必须在父类(super class)中添加方法

你有更好的东西吗?

最佳答案

这里的第一个解决方案是去掉 Vehicle 类。它没有定义 CarBoat 之间的共同契约。
换句话说,Vehicle与其子类的关系并不比java.lang.Object与其子类的关系更有用。


现在,鉴于您无法更改 useVehicleAsCar 的签名,您别无选择,只能检查该方法实现中参数的运行时类。 您本可以使用特定的子类型重载此方法,但这显然是不可能的,因为您将 Vehicle 作为参数是有原因的(与您无法更改的参数相同) ).

当然有许多不受欢迎的方法来检查参数的具体类型,选择哪种方法主要取决于偏好。 会坚持使用 instanceof,因为与 asBoat/asCar 替代方案相比,它保持清晰并保持Vehicle 的“契约(Contract)”没有(甚至更多)不必要的概念。

关于java - 避免 instanceof 和 cast,一个 Super Class 可以知道 children 类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58860552/

相关文章:

java - ARCore 中的粒子系统

java - 是否有任何级别的混淆可以 "trick"instanceof?

javascript - 为什么 JavaScript 的 instanceof 运算符说一个对象不是一个对象?

c++ - 多态性 : raw pointer vs smart pointer

haskell - 在 Haskell 中使用中间多态类型组合函数

java - 在这种情况下继承和多态性如何工作?

Java:检查泛型是否为 int

java - 如何为基于Java RMI的通信设置各种参数?

java - 使用Java在PostgreSQL上的Money数据

java - 如果可能,将信息从 Java PrintStream 发送到 JTextPane 的最佳方法是什么?