传递一个子类的方法,但具有超类作为参数?(Passing in a sub-class to a m

2019-08-01 21:30发布

我有一个抽象类Vehicle有2子类实现RedVehicleYellowVehicle

在另一类我有一个List<Vehicle>含有两种子类的实例。 我希望能够进入一个方法的类类型,然后使用该类型来决定我想在做一些事情来哪些对象的集合List

由于Class是通用的,我应该用什么参数化它,但是把参数作为父类Vehicle停止调用代码,因为工作exampleMethod现在期待一个类型的车辆,而不是一个子类RedVehicleYellowVehicle

我觉得应该是一个干净的方式做,所以这将是实现功能的正确方法?

注:我不必在通过Class类型,如果有更好的建议,我很乐意去尝试的。

调用代码:

service.exampleMethod(RedVehicle.class);
service.exampleMethod(YellowVehicle.class);

字段/方法:

//List of vehicles
//Vehicle has 2 subclasses, RedVehicle and YellowVehicle
private List<Vehicle> vehicles;

//Having <Vehicle> as the Class parameter stops the calling code working
public void exampleMethod(Class<Vehicle> type) 
{
    for(Vehicle v : vehicles)
    {
        if(v.getClass().equals(type))
        {
            //do something
        }
    }
}

Answer 1:

做到这一点,而不是:

public <T extends Vehicle> void exampleMethod(Class<T> type) 


Answer 2:

你为什么不使用访问者模式 ?

这样,你

  • 不需要型令牌
  • 让动态调度处理的情况下区别(而不是if(v.getClass().equals(type))
  • 更灵活(以下OCP )

详细地:

你的抽象类Vehicle获得的方法accept(Visitor v)与子类通过调用适当的方法实现它v

public interface Visitor {
  visitRedVehicle(RedVehicle red);
  visitYellowVehicle(YellowVehicle yellow);
}

使用访问者:

public class Example {

  public void useYellowOnly() {
    exampleMethod(new Visitor() {
        visitRedVehicle(RedVehicle red) {};
        visitYellowVehicle(YellowVehicle yellow) {
             //...action
        });
  }
  public void exampleMethod(Visitor visitor){
      for(Vehicle v : vehicles) {
          v.accept(visitor);
      }  
  }
}


文章来源: Passing in a sub-class to a method but having the super class as the parameter?
标签: java oop