当前位置: 首页 > 面试题库 >

重载不可变类中的方法

程亦
2023-03-14
问题内容

假设我有一个Point带有x和y参数的不可变类,以及一个add定义如下的方法:

class Point:
  Point add(int x, int y):
    return new Point(this.x + x, this.y + y);

由于它是不可变的,因此它返回一个新的Point。这一切都很好,直到我们有了一个扩展Point并重新定义的类add。

class ColoredPoint extends Point:
  ColoredPoint add(int x, int y):
    return new ColoredPoint(this.x + x, this.y + y, this.width, this.height)

我们必须编写新的定义,因为否则将返回addon的方法,这是不好的。但是现在,这在大多数语言中都行不通,因为我们正在压倒一切,但我们只是在对返回类型进行歧义处理。语言不允许您只对返回类型进行歧义的方法,因为在大多数情况下,这可能是模棱两可的。ColoredPointPointadd

那么我们该怎么办?

我看到的唯一解决方案是:

使它们都实现一些接口,例如 IPositionable
放弃不变性。
还要别的吗?


问题答案:

如果要强制不变性,则不能有子类。例如java.lang.String,参见,final由于这样的原因,它是一个类:防止人们将String子类化以使其可变。

另外,为什么要首先Rect扩展Point?这不是一回事吗?从几何角度看,它们甚至不存在于相同的维中。

最后,我看不到子类上的方法问题返回更严格的类型(以及某些不支持这种语言的语言)与不变性之间的联系。



 类似资料:
  • Java代码: 我的问题是:类中的是否重载了超类中同名的? 我的朋友说他们不是因为他们不在一个班。

  • 问题内容: 通过遵循所有Java标准,我的班级变得一成不变 这些是我在定义不可变类时所做的主要检查点。 但是还有一个问题,我的对象仍然可以通过java反射进行修改,对吗?还是我在课堂上错过了任何一点? 提前致谢。 问题答案: 没有什么可以躲藏的-即使是不可变的类也不能幸免。但是,您对此无能为力,因此“无法通过反射进行修改”不是不变性的标准之一。

  • 我正在Java中练习一些例子。代码如下所示: 关于这一点,我没有什么问题, 1) 上面的代码使用method1(算术异常e)执行并打印null,为什么不使用异常(因为它位于层次结构的顶部)? 猜测:这是因为与异常相比,算术异常更加具体。如果是这样,为什么要问第二个问题 2) 通过在现有代码中引入以下方法,程序显示编译时异常。为什么? 帮助我学习。谢谢

  • 这是有道理的,谢天谢地,还有一个选项可以生成接受可空参数的方法。此选项生成一个附加的方法,该方法接受一个可为空的参数。但是,不管有没有这种方法,Mapstruct似乎都失败了。 作为一种变通方法,我实现了这个令人讨厌的方法(但在这一点上,我宁愿自己实现映射方法): 有没有什么方法可以让Mapstruct寻找重载的方法(或者先看到“正确的”方法)?我是走错路了还是错过了什么?谢了!

  • 本文向大家介绍Python的可变类型和不可变类型?相关面试题,主要包含被问及Python的可变类型和不可变类型?时的应答技巧和注意事项,需要的朋友参考一下 可变数据类型:列表、字典、可变集合 不可变数据类型:数字、字符串、元组、不可变集合    

  • 问题内容: 我正在Google App Engine中制作一个购物车应用。我有许多从基本处理程序派生的类: 这是否意味着每个后代类的方法都需要具有相同的参数?这很麻烦。实际上只有一个后代使用该参数。而当我添加新的参数时呢?我需要遍历每堂课吗? 问题答案: 重写的方法原则上不必彼此具有相同的参数,但是它们必须具有与调用它们相同的形式参数。因此,由于任何处理程序都可以通过调用它,是的,它们必须相同。就