2010-09-08 86 views
3

我喜歡這個擴展類在Java中

ArrayList <Page> pageList = aForeignObject.getAllPages(); 

對象的列表和子類

class MyPage extends Page 
{ 

    public void newFunction() 
    { 
     // A new Feature 
    } 
} 

是否有可能以某種方式頁面對象轉換爲我的編目物體?

我很想去做某事這樣的:

MyPage page = pages.get(1); // This will obviously fail 
page.newFunction(); 
+0

@ C++程序員:這是我們可以用'dynamic_cast'嗎? – 2010-09-08 11:56:25

+0

@Martijn - 不,如果類是您要轉換的類的類型(或子類型),則動態轉換隻會上變換。 – 2010-09-11 00:03:01

回答

1

短期解決方案是鑄造:

MyPage page = (MyPage)pages.get(1); 

注意,這需要討論的對象實際上是MyPage型的 - 否則演員表失敗,出現ClassCastException。如果你不知道的話,你可以檢查對象第一類型:

Page elem = pages.get(1); 
if (elem instanceof MyPage) { 
    MyPage page = (MyPage)elem; 
    ... 
} 

不過,需要做這樣的向下轉換往往是你一流的設計可以改善的跡象。如果 aForeignObject.getAllPages()總是返回一個 MyPage對象的列表,則應相應地更改其返回類型。否則,如果 newFunctionPage的界面中有意義(即使是抽象的或具有空的默認實現),您應該考慮在其中添加它;那麼你可以直接致電 newFunctionPage參考,而不需要downcast。

更新:所以你確實有要轉換成MyPage對象Page對象...的技術方案,這將是一個轉換構造

class MyPage extends Page { 
    MyPage(Page other) { 
    // deep copy internal state 
    } 
    ... 
} 

雖然技術上這是如果可能的話,我仍然會重新考慮需要這種解決方案的設計方法。如果您使用第三方代碼,您不能更改,但這不是一個選項。

+0

不幸的是,該對象是一個Page的實例,而不是MyPage – Jan 2010-09-08 10:29:10

+0

我很想將這個函數添加到Page中,但它是外國圖書館的一部分。我也不知道如何達到「真實」頁面對象的內部狀態。 – Jan 2010-09-08 10:39:30

+1

@Jan,那麼恐怕除了@Scott提出的[裝飾器](http://en.wikipedia.org/wiki/Decorator_pattern)方法之外別無選擇。作爲一個側面說明,包括所有這些信息在您的原始文章,而不是評論將節省我們所有人一些無用的打字...... – 2010-09-08 10:43:10

4

如果Page對象走出getAllPages()方法實際上是MyPage對象,然後只需使用一個轉換(如MyPage page = (MyPage) pages.get(1);。如果他們不是(這是可能的,如果你正在使用外部代碼),你不能。使用子類,你可以做什麼,但是,是使用組成:

class MyPage{ 
    private Page p; 

    public MyPage(Page aPage){ 
     p = aPage; 
    } 

    public void newFunction(){ 
     //stuff 
    } 

    public Object oldFunction(){ 
     return p.oldFunction(); 
    } 
} 

那麼你可以做這樣的東西:

MyPage page = new MyPage(pages.get(1)); 
page.newFunction(); 
+0

我想過這個解決方案,但是我將不得不寫50個「舊」功能,必須改變它每次頁面類改變 – Jan 2010-09-08 10:31:01

+0

如何使它成爲一個明確的包裝 - 然後有一個公共的'Page getOldPage()'方法,允許直接調用舊的方法。 – Scott 2010-09-08 10:38:12

+0

猜猜我會這樣做。認爲可能有更好的辦法。 – Jan 2010-09-08 10:40:37

0

這顯然是混亂,但可以工作...

Page page = pages.get(1); 
if (page instanceof MyPage) { 
    ((MyPage)page).newFunction(); 
} 

可以容納所有類,extends頁的清單,即現在

List <? extends Page> pageList = aForeignObject.getAllPages(); //Bear in mind that Page objects will never be found here. 

,如果列表中只有我的頁面,那麼你可以用我上面的例子。就像我說的那樣,這不是一個有效的方法,也不是一個有效的解決方案。

0

我認爲解決方案是在Page中實現您的「新功能」。在我和之前,我也遇到了一些這樣的情況,在基類中實現它就是解決方案。但我不確切知道你是哪種情況......

第二種解決方案(不推薦):使你的「新功能」成爲一種靜態方法。事情是這樣的:

public static void feature(Page page) 
{ 
    .... 
} 

然後,你可以在我的頁面的快捷方式:

public void invokeFeatureMethod() 
{ 
    feature(this); 
}