java - 充分利用 Java 中的多态性

标签 java polymorphism abstract-class

我有以下问题:

假设我们有 3 个类:

  • 一个名为 Vehicle 的抽象类
  • 一个名为 Motorcycle 的类延伸Vehicle
  • 一个名为 Car 的类延伸Vehicle

这意味着Vehicle物体可以同时容纳MotorcycleCar对象。

我还有一个名为 VehicleDatabase 的类(class)它基本上“模拟”一个数据库(我希望我可以使用数据库,但这是一个大学项目)并拥有 ArrayList<Vehicle>名为 db 的字段以及一些提供一些基本操作的方法,以便我可以与数据库交互(CRUD 操作和其他一些操作)。

我想要实现的一个方法是showVehicles() 。为了简化并解决我的问题,我们假设此方法必须简单地将 .toString() 打印到控制台。函数参数指定的所有对象的 。

示例:

用户中显示菜单:

Select which type of vehicles you want to be shown:

1.Motorcycles
2.Cars

Make your choice: 

之后我们的函数showVehicles必须采用一个参数,例如 showVehicles(CarSomething)并打印 db 上存储的所有汽车数组列表。我实在找不到更优雅的方式来实现该功能。以下是我当前的实现:

public void showVehicles(Class<?> cls)
{
    for(Vehicle v : db)
    {
        if(v.getClass().equals(cls))
            System.out.println(v.toString());
    }
}

并像这样调用它: showVehicles(Car.class)showVehicles(Motorcycle.class) .

有更好的方法吗?请提出您的建议。我只是觉得我没有使用应有的多态性。

最佳答案

这是一种可能性。

我创建了一个Map<Class<?>, List<Vehicle>>持有库存。

map 是根据车辆列表创建的,但也可以通过简单地直接添加到 map 来创建。

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

abstract class Vehicle {
}

class MotorCycle extends Vehicle {
   String name;

   MotorCycle(String name) {
      this.name = name;
   }
   public String toString() {
      return name;
   }
}

class Car extends Vehicle {
   String name;

   Car(String name) {
      this.name = name;
   }

   public String toString() {
      return name;
   }
}

public class CarMapper {

   public static void main(String[] args) {
      List<Vehicle> list = new ArrayList<>();
      list.add(new MotorCycle("Honda"));
      list.add(new MotorCycle("Harley-Davidson"));
      list.add(new Car("Ford"));
      list.add(new Car("Chrysler"));

      Map<Class<?>, List<Vehicle>> inventory = list.stream().collect(
            Collectors.groupingBy(Object::getClass));

     }
}

这是否是一个合理的方法取决于您(以及其他发表评论的人)。您可能仍然需要 map 才能从用户菜单中获取正确的类别。

  Map<String, Class<?>>  menuMap = new HashMap<>();
  menuMap.put("Car", Car.class);
  menuMap.put("MotorCycle", MotorCycle.class);

  Class<?> lookup = menuMap.get("Car");

  for (Vehicle v : inventory.get(lookup)) {
     System.out.println(v.toString()); 
  }

关于java - 充分利用 Java 中的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59461160/

相关文章:

java - Java中的多态问题

javascript - 为什么单态和多态在 JavaScript 中很重要?

java - 简单的maven文件中发生Maven构建错误

java - 进度更新较晚

c++ - 不能向侧面动态施放

c# - 这两个c#抽象类有什么区别?

java - 如何创建实现接口(interface)的抽象类对象(JAVA)

java - Spring JDBC - 批量删除和插入

Windows 上的 Java 串行通信

c# - 我可以在 C# 中创建使用未知类型参数声明方法的接口(interface)或抽象类吗?