【问题标题】:Best way to call same method from different classes in java从java中的不同类调用相同方法的最佳方法
【发布时间】:2020-08-17 09:54:01
【问题描述】:

我有几个类的方法完全相同

public class Car{
    int goBrrr();
}
public class Bus{
    int goBrrr();
}

等等

我需要用这些类的对象创建 ArrayList,并在循环中使用相同的方法

for (Vehicle vehicle: vehicleList{
    vehicle.goBrrr();
}

类不能更改。

哪种解决方案更好: 使用所需的字段和方法创建新类并将其填充到构造函数中

public final class Vehicle{
    int wheels;
    String engine;
    ...
    
    Vehicle (Car car) {...}
    Vehicle (Truck truck) {...}
    ...

    int goBrrr();
}

创建接口

interface Vehicle{
    int goBrrr();
}

并扩展类

class ExtCar extends Car implement Vehicle{
    @Override
    int goBrrr();
}
class ExtBus extends Bus implement Vehicle{
    @Override
    int goBrrr();
} 

或者也许有更好的解决方案?

【问题讨论】:

  • 汽车和巴士不能延期,因为它们是最终的;因此最终选项不会编译
  • 我的错,课程不是最终的。但我仍然无法改变它们。例如,我不能只添加工具。

标签: java oop arraylist


【解决方案1】:

正如下面代码中提到的,您可以将 Vehicle 创建为接口。 并提供该通用方法,对于 Vehicle 的单独实现,您可以提供该方法的自定义实现。

创建列表时,只需添加Car/Bus/Truck的Object,它会自动根据类型调用该类的方法。

interface Vehicle{
    int goBrrr();
}
class Car implements Vehicle{

    @Override
    public int goBrrr() {
        System.out.println("Car");
        return 0;
    }
}
class Bus implements Vehicle{

    @Override
    public int goBrrr() {
        System.out.println("Bus");
        return 0;
    }
}
class Main{
    public static void main(String[] args) {
        List<Vehicle> vehicleList= new ArrayList<>();
        vehicleList.add(new Bus());
        vehicleList.add(new Car());
        for(Vehicle vehicle:vehicleList){
            vehicle.goBrrr();
        }
    }
}

这将打印输出如下

Bus
Car

【讨论】:

    【解决方案2】:

    我建议使用接口 Vehicle 在 Bus 和 Car 上实现 goBrrr 方法。在下面的示例中,我为每个 goBrrr 方法返回了一个值,并演示了如何在 Main psvm 方法中使用该列表。 在车辆接口中使用抽象允许 List 保持对其他类(如卡车)的扩展开放和对修改关闭(当添加新类时,主类不需要更改)

    class Main{
    
        public static void main(String[] args) {
    
            Vehicle vehicle = new Bus();
            List<Vehicle> vehicleList = new ArrayList<>();
    
            vehicleList.add(vehicle);
            vehicleList.add(vehicle);
            vehicleList.add(vehicle);
    
            for(Vehicle v : vehicleList){
                System.out.println(v.goBrrr());
            }
    
        }
    }
    interface Vehicle {
        int goBrrr();
    }
    final class Car implements Vehicle {
    
        public int goBrrr(){
            return 10;
        }
    }
    final class Bus implements Vehicle {
        public int goBrrr(){
            return 11;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-08-11
      • 2019-03-03
      • 1970-01-01
      • 2013-08-01
      • 2015-03-29
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      相关资源
      最近更新 更多