java - 把 parent 投给它的 child

标签 java oop

我有:

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/

相关文章:

java - 如何读取作为命令参数的文本文件(字符串)的第一行(在Java中使用eclipse)

Java repaint() 不调用 paintComponent

c# - 如何同步三个类(class)?

java - 像这样在构造函数中调用init方法是否违反了Clean Code

javascript - 构造函数中的函数以某种方式调用自身

c++ - 多态性(类型)

java服务器http服务器收到来自Chrome的空请求

java - 我有一个 HashMap 如何将它与 GUI 集成;我想输入整数并获取字符串值。

java - 在 Java 中获取操纵杆输入

python - 如何使用 lambda 表达式进行比较?