gpt4 book ai didi

Java 多态性和方法链

转载 作者:搜寻专家 更新时间:2023-11-01 03:19:01 27 4
gpt4 key购买 nike

所以我有几个这样定义的继承类。

class Base {
public Base chainedMethodA() {
// some stuff
return this;
}
}

class Derived extends Base {
public Derived chainedMethodB() {
// some stuff
return this;
}
}

现在,下面的代码可以工作了:

Derived obj = new Derived();
obj.chainedMethodB().chainedMethodA();

但这不会(注意函数调用的切换顺序):

Derived obj = new Derived();
obj.chainedMethodA().chainedMethodB();

编译器在调用 chainedMethodB() 函数时出错。我可以理解这是因为当你运行 chainedMethodA() 时,它返回一个 Base 类型的对象,它没有定义 chainedMethodB

我能想到几个解决这个问题的办法:

  1. 链式方法同时注意顺序(先调用Derived的方法,再调用Base的方法)。这看起来是一个非常脆弱的解决方案。
  2. 重写 Derived 中的 chainedMethodA,因此它返回 Derived 的实例而不是 Base。这看起来像是在浪费继承权。

有什么优雅的方法可以解决这个问题吗?也许某些构造会神奇地更改 chainedMethodA 以在被 Derived 类型的对象调用时返回 Derived 实例,而不会在 中显式覆盖派生.

最佳答案

Override chainedMethodA in Derived so it returns an instance of Derived instead of Base. This looks like a waste of inheritance.

你错了。您没有浪费继承权。

overriding technique就是做恰恰,也就是专门化一个方法。当返回类型与父类(super class)中原始重写方法中声明的返回类型相同或为子类型时,可以进行重写。因此,在这种情况下,您没有违反任何规定。

阅读here有关覆盖的更多信息。

此处示例 1:(调用父类(super class)方法)

public class Derived extends Base {
@Override
public Derived chainedMethodA(){

super.chainedMethodA();
//some stuff
return this;
}

public Derived chainedMethodB() {
// some stuff
return this;
}
}

这里是示例 2:(完全更改它)

public class Derived extends Base {
@Override
public Derived chainedMethodA(){
//some stuff
return this;
}

public Derived chainedMethodB() {
// some stuff
return this;
}
}

关于Java 多态性和方法链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37038534/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com