-1

我发现自己处于一个狭窄的位置。 我正在一个罐子里给我的现有项目建立一些逻辑。因此我没有修改这些类的能力。将基类的对象转换为派生类

我想写一个额外的方法到现有的类,使其功能丰富。这些方法可以在少量实例数据上运行,也可以使用一些现有的实例方法。

,因为类不能直接修改我写这些额外的方法在其新的派生类。考虑下面的例子

public class Parent 
{ 
    public void existing method() 
    { 

    } 
} 


public class Child extends Parent 
{ 
    public void newMethod() 
    { 

    } 
} 


public class Other 
{ 
    public Parent foo() 
    { 
    Parent pr = new Parent(); 
    return pr; 
    } 
} 

public class Test 
{ 
    Other o = new Other(); 
    Parent p = o.foo; 
    Child c = (Child) p; 
    c.newMethod(); 
} 

当我运行这段代码我得到一个ClassCastException。我知道我很沮丧。 有没有一种方法可以将基类的对象转换为派生类的对象?

如果是,那么可以降级的合法方案是什么?

如果不是那么应该如何解决上述情况? 。我应该改变设计

感谢您的意见/建议!

+0

当您调用newMethod()时,为什么不能在派生类上调用它?像新的Child()。newMethod()? – 2014-09-25 19:15:07

+0

什么阻止你在测试中直接创建一个子类?小孩c =新小孩()? – 2014-09-25 19:15:10

+0

您应该在方法foo()中创建Child的一个实例。或者出于某些原因不可能? – 2014-09-25 19:18:06

回答

2

你想要做的事违背了多元论和遗产的概念,你只能将一个子对象放到一个父对象中,因为它们共享相同的基本属性,但是你不能试图将一个父对象放入他的孩子。

我建议在你的其他类中创建一个“强制转换”方法,在那里你将把所有重要的东西放在子中,然后用这些数据创建一个父对象并返回它。

事情是这样的:

public Parent downcast(Child c) 
{ 
    Parent cast = new Parent(); 
    //Transfer data from the child to the parent 
    cast.setProperty(c.getProperty()); 
    return cast; 
} 

有可能是比这更好的解决方案,但它可以很容易地解决你的问题。

更新

这也可以帮助你,也许是重复的? :How to downcast a Java object?