2014-09-25 145 views
-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?