我的车库里真的有一辆车吗? [复制]

2024-04-22

我是 Java 编程的新手,正在尝试掌握 OOP。

所以我构建了这个抽象类:

public abstract class Vehicle{....}

和2个子类:

public class Car extends Vehicle{....}
public class Boat extends Vehicle{....}

Car and Boat还包含一些不常见的独特字段和方法(没有相同的名称,因此我无法在 Vehicle 中为它们定义抽象方法)。

现在在 mainClass 中我已经设置了我的新车库:

Vehicle[] myGarage= new Vehicle[10];
myGarage[0]=new Car(2,true);
myGarage[1]=new Boat(4,600);

我对多态性非常满意,直到我尝试访问 Car 独有的字段之一,例如:

boolean carIsAutomatic = myGarage[0].auto;

编译器不接受这一点。我使用强制转换解决了这个问题:

boolean carIsAutomatic = ((Car)myGarage[0]).auto;

这可行......但它对方法没有帮助,只对字段有帮助。意思是我做不到

(Car)myGarage[0].doSomeCarStuff();

所以我的问题是——我的车库里到底有什么?我试图获得直觉并了解“幕后”发生的事情。


为了方便未来的读者,以下是答案的简短摘要:

  1. 是的,有一个Car in myGarage[]
  2. 作为一种静态类型语言,如果通过基于 Vehicle 超类的数据结构(例如Vehicle myGarage[])
  3. As for how to solve, there are 2 main approaches below:
    1. 使用类型转换,这将减轻编译器的担忧并将设计中的任何错误留给运行时
    2. 我需要选角的事实表明设计有缺陷。如果我需要访问非车辆功能,那么我不应该将汽车和船只存储在基于车辆的数据结构中。要么使所有这些功能属于车辆,要么使用更具体(派生)的基于类型的结构
  4. 在许多情况下,组合和/或接口将是继承的更好替代方案。可能是我下一个问题的主题......
  5. 如果有人有时间浏览答案的话,还有许多其他好的见解。

如果您需要区分Car and Boat在你的车库里,那么你应该将它们存放在不同的结构中。

例如:

public class Garage {
    private List<Car> cars;
    private List<Boat> boats;
}

然后您可以定义特定于船只或特定于汽车的方法。

那为什么还要有多态性呢?

比方说Vehicle就好像:

public abstract class Vehicle {
   protected int price;
   public getPrice() { return price; }
   public abstract int getPriceAfterYears(int years);
}

Every Vehicle有一个价格,因此可以将其放入Vehicle抽象类。

然而,确定 n 年后价格的公式取决于车辆,因此由实现类来定义它。例如:

public Car extends Vehicle {
    // car specific
    private boolean automatic;
    @Override
    public getPriceAfterYears(int years) {
        // losing 1000$ every year
        return Math.max(0, this.price - (years * 1000));  
    }
}

The Boat类可能有其他定义getPriceAfterYears以及具体的属性和方法。

所以现在回到Garage类,您可以定义:

// car specific
public int numberOfAutomaticCars() {
    int s = 0;
    for(Car car : cars) {
        if(car.isAutomatic()) {
            s++;
        }
    }
    return s;
}
public List<Vehicle> getVehicles() {
    List<Vehicle> v = new ArrayList<>(); // init with sum
    v.addAll(cars);
    v.addAll(boats);
    return v;
}
// all vehicles method
public getAveragePriceAfterYears(int years) {
    List<Vehicle> vehicules = getVehicles();
    int s = 0;
    for(Vehicle v : vehicules) {
        // call the implementation of the actual type!
        s += v.getPriceAfterYears(years);  
    }
    return s / vehicules.size();
}

多态性的好处是能够调用getPriceAfterYears on a Vehicle without关心落实。

通常,向下转型是设计有缺陷的标志:如果您需要区分车辆的实际类型,请勿将车辆全部存放在一起。

注意:当然这里的设计可以很容易地改进。这只是一个证明要点的例子。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我的车库里真的有一辆车吗? [复制] 的相关文章

  • java中监视目录变化

    我正在使用 WatchService 来监视目录中的更改 特别是目录中新文件的创建 下面是我的代码 package watcher import java nio file import static java nio file Stand
  • Java:扩展类并实现具有相同方法的接口

    可能无法完成以下操作 我收到编译错误 继承的方法 A doSomthing int 无法隐藏 B 中的公共抽象方法 public class A int doSomthing int x return x public interface
  • TreeMap 删除所有大于某个键的键

    在项目中 我需要删除键值大于某个键的所有对象 键类型为Date 如果重要的话 据我所知TreeMapJava中实现的是红黑树 它是一种二叉搜索树 所以我应该得到O n 删除子树时 但除了制作尾部视图并一一删除之外 我找不到任何方法可以做到这
  • 如何在 JavaFX 中连接可观察列表?

    我所说的串联是指获得一个新列表 该列表侦听所有串联部分的更改 方法的目的是什么FXCollections concat ObservableList
  • Android中如何使用JNI获取设备ID?

    我想从 c 获取 IMEIJNI 我使用下面的代码 但是遇到了未能获取的错误cls 它总是返回NULL 我检查了环境和上下文 它们都没有问题 为什么我不能得到Context班级 我在网上搜索了一下 有人说我们应该使用java lang Ob
  • Jframe 内有 2 个 Jdialogs 的 setModal 问题

    当我设置第一个选项时 我遇到了问题JDialog模态 第二个非模态 这是我正在尝试实现的功能 单击 测试对话框 按钮 一个JDialog有名字自定义对话框 主要的将会打开 如果单击 是 选项自定义对话框主 其他JDialog named 自
  • 从 MATLAB 调用 Java?

    我想要Matlab程序调用java文件 最好有一个例子 需要考虑三种情况 Java 内置库 也就是说 任何描述的here http docs oracle com javase 6 docs api 这些项目可以直接调用 例如 map ja
  • java inputstream 打印控制台内容

    sock new Socket www google com 80 out new BufferedOutputStream sock getOutputStream in new BufferedInputStream sock getI
  • Runtime.exec 处理包含多个空格的参数

    我怎样才能进行以下运行 public class ExecTest public static void main String args try Notice the multiple spaces in the argument Str
  • 如何在单个查询中搜索 RealmObject 的 RealmList 字段

    假设我有一堂课 public class Company extends RealmObject private String companyId private RealmList
  • 如何在 Spring 中使 @PropertyResource 优先于任何其他 application.properties ?

    我正在尝试在类路径之外添加外部配置属性资源 它应该覆盖任何现有的属性 但以下方法不起作用 SpringBootApplication PropertySource d app properties public class MyClass
  • Android 无法解析日期异常

    当尝试解析发送到我的 Android 客户端的日期字符串时 我得到一个无法解析的日期 这是例外 java text ParseException 无法解析的日期 2018 09 18T00 00 00Z 位于 偏移量 19 在 java t
  • Sun 在 EDT 之外做 GUI 工作的演示?

    我正在看SplashDemo java http download oracle com javase tutorial uiswing examples misc SplashDemoProject src misc SplashDemo
  • Akka 与现有 java 项目集成的示例

    如果我已经有现有的javaWeb 应用程序使用spring and servlet容器 将 Akka 集成到其中的正确方法是什么 就像我将会有Actor1 and Actor2互相沟通的 开始使用这些演员的切入点是什么 例如 1 把它放在那
  • 使用 Elastic Beanstalk 进行 Logback

    我在使用 Elastic Beanstalk 记录应用程序日志时遇到问题 我正在 AWS Elastic Beanstalk 上的 Tomcat 8 5 with Corretto 11 running on 64bit Amazon Li
  • 将 JScrollPane 添加到 JFrame

    我有一个关于向 Java 框架添加组件的问题 我有一个带有两个按钮的 JPanel 和一个添加了 JTable 的 JScrollPane 我想将这两个添加到 JFrame 中 我可以将 JPanel 添加到 JFrame 或将 JScro
  • java 中的蓝牙 (J2SE)

    我是蓝牙新手 这就是我想做的事情 我想获取连接到我的电脑上的蓝牙的设备信息并将该信息写入文件中 我应该使用哪个 api 以及如何实现 我遇到了 bluecove 但经过几次搜索 我发现 bluecove 不能在 64 位电脑上运行 我现在应
  • Java 正则表达式中的逻辑 AND

    是否可以在 Java Regex 中实现逻辑 AND 如果答案是肯定的 那么如何实现呢 正则表达式中的逻辑 AND 由一系列堆叠的先行断言组成 例如 foo bar glarch 将匹配包含所有三个 foo bar 和 glarch 的任何
  • Java 11 - 将 Spring @PostConstruct 替换为 afterPropertiesSet 或使用 initMethod

    我正在使用 spring 应用程序 有时会使用 PostConstruct用于代码和测试中的设置 看来注释将被排除在外Java 11 https www baeldung com spring postconstruct predestro
  • Spring RESTful控制器方法改进建议

    我是 Spring REST 和 Hibernate 的新手 也就是说 我尝试组合一个企业级控制器方法 我计划将其用作未来开发的模式 您认为可以通过哪些方法来改进 我确信有很多 RequestMapping value user metho

随机推荐

  • swift 中的 UIView viewwithtag 方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在努力学习一些快速的知识 我以编程方式添加标签 我想稍后更改它们的属性 viewwithtag 方法返回一个 UIView 如何从
  • 复制切片的通用方法

    我需要复制切片 以及底层数组的一部分 以便调用者不会改变数组的原始元素 我想我可以编写一个函数来对特定类型的数组执行此操作 func duplicateSliceOfSomeType sliceOfSomeType SomeType Som
  • 由于将请求从主线程传递到工作线程,netty 中出现延迟?

    我有一些关于 Netty 服务器端 TCP IP 应用程序的问题 我想知道在将请求从老板线程传递到工作线程时是否会因为 netty 由于缺少配置等 而出现延迟 我在用 new OrderedMemoryAwareThreadPoolExec
  • 使用 SolidJS 中的 fetch API 渲染远程数据

    我是一个使用 Solid JS 以及就此而言的 JS 的新手 并且在尝试填充 自定义 时遇到了看似奇怪的行为 table 使用来自 API 的数据的组件fetch 这是我的 table import Component For from s
  • 为什么我的 SqlConnection 在关闭后仍保留在 SSMS 进程列表中?

    我有一个 C 控制台应用程序 代码如下 using var cn new SqlConnection cn ConnectionString Data Source localhost Integrated Security True Pe
  • 使用 Xcode 的命令行构建工具进行存档(xcodebuild archive)

    用于构建 Xcode 项目的命令行工具 xcodebuild 在 Xcode 4 中提供了一个新的构建操作 archive From man xcodebuild archive Archive a scheme from the buil
  • SwiftUI Focus State API 环境变量不起作用

    当我们想要观察 SwiftUI 文本字段的焦点状态时 环境值 isFocused 似乎不起作用 除了将值传递给 TextFieldStyle 的 init 我们必须为每个 Textfield 执行此操作 之外 还有其他方法可以做到这一点吗
  • 如何重置html中选定的索引下拉值?

    我需要在提交表单后为下拉菜单设置 selectedindex 0 我尝试如下 filterByName prop selectedIndex 0 filterByName selectedIndex 0 filterByName get 0
  • Oracle 查询和聚合函数

    我假设在oracle 中有表名employee 1 如果 mobile no 和 sim no 相同 我想选择最大 start date 我已经尝试过 但没有成功 请帮忙 下面是employee 1表 Mobile No Sim NO St
  • 将字符串数组绑定到 datagridview 的列

    我正在设计一个有 datagridview 的 winform 我正在为该 datagridview 分配一个数据表 DataTable dt new DataTable dt Columns Add items typeof string
  • 学习 MacRuby 的好资源 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我不懂 Ruby 但我有兴趣学习 MacRuby 您会推荐什么作为您的最佳资源 书籍 博客 网站 Fo
  • 实体框架迁移问题

    我在 EF 迁移方面遇到问题 特别是让 Enable Migrations 命令发挥作用 当我在包管理器控制台中执行命令时 收到以下错误 System Management Automation PSArgumentException 找不
  • ASP.NET Core 2.0 站点 - FileIOException System.Runtime

    一位同事正在为我们的下一份工作整理一些框架项目 这些项目在他的机器上运行良好 并且我们的其中一台开发服务器正在托管开发实例 由于我们刚刚建立 这些项目或多或少是空的 由单个静态 html 文件组成 这些项目在我的开发机器上构建得很好 但一旦
  • Python 3.x 列表理解 VS 元组生成器

    我想使用内存 速度或其他什么原因吗 tuple i for i in range 5000 代替 i for i in range 5000 如果我不介意元组的不变性 基本上 列表理解比生成器表达式更快 因为 它的迭代在 C 中执行 请阅读
  • 按 HTML 实体分割字符串?

    我的字符串包含很多 HTML 实体 就像这样 大家好 大家好 我想按 HTML 实体将其拆分为 Hello大家 there 有人可以建议我一种方法吗 可能正在使用正则表达式 看起来你可以分开 正则表达式 也就是说 分隔符是以以下开头的字符串
  • 货币数据类型精度 - SQL Server (SSMS)

    在sql server management studio中 数据类型 金钱 当我输入带有小数的金额时 它会自动添加零以填充到百分之一 如何确定小数点后的空格数 点后面零的个数称为precision的一种数据类型 这money数据类型有一个
  • Swagger Editor 3.8 示例不适用于参考数组模式

    这个问题是后续问题这个类似的 https stackoverflow com q 52595690 1571426 正如 Helen 要求提出一个新问题 数组类型模式似乎只接受 示例 而不接受 示例 以下架构会产生错误编辑器 swagger
  • Android 8 本机库崩溃

    自从 Android 8 Oreo 推出以来 我们的应用程序一直在不同的地方崩溃 所有 Play 商店崩溃报告都显示本机崩溃 最常出现的一个似乎是在本机库中 最常崩溃的设备是 Google Pixel Pixel XL 也出现过一些崩溃 我
  • Javascript 随机定位 Div 且不重叠它们

    我一直在研究一个随机的概念想法 即让 6 个云出现在一个页面上 并从数据库中提取随机评论 这部分很简单 但我发现确保 6 朵云不相互重叠非常困难 我对碰撞检测进行了很多研究 发现在将新的 随机定位 div 放置在页面上之前 没有真正合适的方
  • 我的车库里真的有一辆车吗? [复制]

    这个问题在这里已经有答案了 我是 Java 编程的新手 正在尝试掌握 OOP 所以我构建了这个抽象类 public abstract class Vehicle 和2个子类 public class Car extends Vehicle