【问题标题】:How to get a subclass to override a parent abstract method with an extended type? [duplicate]如何让子类用扩展类型覆盖父抽象方法? [复制]
【发布时间】:2017-03-17 11:59:41
【问题描述】:

例如

public abstract class ParentClass {

    public abstract FooType getFoo();
    ...
}

然后是类似的东西

public abstract class SomeClass extends ParentClass {

    public abstract SpecialFooType getFoo(); //clashes with the parent!
    ...
}

在这种情况下,来自 SomeClass 的 getFoo() 应该是实现接口 SpecialFooType 的 FooType。但是我不知道如何为此设置语法。

【问题讨论】:

  • SpecialFooType 是否扩展 FooType
  • @bradimus 不。FooType 只是它自己的类。但是,如果您从特定子类中获取 FooType,我希望它具有其他属性,这些属性在接口 SpecialFooType 中定义。换句话说,我希望子类中的 getFoo() 返回既是 FooType 又是 SpecialFooType 的东西。
  • 您不能这样做,因为 SpecialFooType getFoo()FooType getFoo() 只会在返回类型上有所不同。它们将具有相同的签名。如果ParentClass 是通用的,您可能会解决。
  • 什么意思?

标签: java inheritance overriding abstract-class abstract


【解决方案1】:

继承更多而不仅仅是将extends放在某个类声明上。

例如,您的课程必须遵循Liskov substitution principle。该原则规定了覆盖方法的外观。

它实际上允许缩小返回值的类型;比如:基类有Number getFoo();子类可以做Integer getFoo()。但在您的情况下,返回类型是不同的;因此,您的想法在概念层面上是完全错误的!

这背后的原因。如果您有调用该方法的 client 代码,则 client 必须 需要知道它是否在基类上调用该方法.. . 或某个子类。换句话说:客户端代码必须能够处理 Number 响应,所以它当然能够处理返回的 Integer。现在考虑一下它在您的设置中应该如何工作......正如所说:它不会!

为了完整起见:LSP 说 return 类型可以缩小,而方法参数可以扩大。所以当基类 foo() 取一个 Integer 时,子类 foo() 可以取一个 Number。

【讨论】:

  • 我见过多次提到的 LSP,但我根本不理解 Wiki,也从未见过用简单的术语解释它的 SO 答案,所以不幸的是,这不是我知道如何去做的原则申请。
  • 我刚刚更新了我的答案。如果这还不够,我可以提供更多提示……稍后。现在出去遛狗;-)
  • 一只鬼猫遛狗……那会很狂野。
  • 不客气。我又加了一句关于参数类型的内容,希望能帮助你完全进入 LSP。感谢您的快速接受!而且不会有太多的东西看;鬼狗在遛狗的地方,是一片漆黑的夜晚。
猜你喜欢
  • 2017-08-17
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
相关资源
最近更新 更多