gpt4 book ai didi

java - 把 parent 投给它的 child

转载 作者:搜寻专家 更新时间:2023-11-01 01:07:56 25 4
gpt4 key购买 nike

我有:

class A
{
public String getID() { return "id of A";}
}

class B extends A
{
public String getID() { return "id of B"; }
}

class C {
public A returnA() {
return new A();
}
}

现在我不知何故需要做:

C c = new C();
B b = (B)c.returnA();
String id = b.getId();

但是我无权访问C.returnA() 的实现,并且我无法将它的返回类型更改为B。

最佳答案

您正在将父项转换为子项。你永远不能那样做,因为 new A() 绝对不是 B

考虑一下:String extends Object。现在尝试转换 (String) new Object()。这根本没有任何意义。

因为您的对象无论如何都不是 B,所以它不可能具有 B 的行为。

你在这里想要的是使用装饰器模式。参见 http://en.wikipedia.org/wiki/Decorator_pattern

下面是装饰器的实现示例:

public class B extends A {

private A decorated;
public B(A decorated) {
this.decorated = decorated;
}

@Override
public String getID() {
return "id of B";
}

@Override
public void otherMethodOfA() {
return decorated.otherMethodOfA();
}
}

请注意,必须覆盖 A 的所有方法,以确保您在装饰元素上调用该方法。 (这里以otherMethodOfA为例)

像这样使用:

C c = new C();
B b = new B(c.returnA());
String id = b.getID();

关于java - 把 parent 投给它的 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24957598/

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