2012-10-17 187 views
3

BasePage.java的Java擴展類

public class BasePage { 
    //do stuff 
} 

Center.java

public class Center { 
    public BasePage click(){ 
     click(button); 
     return new BasePage(this); 
    } 

    // do other stuff 
} 

public class Helper { 
    protected Center center; 

     // do stuff 
} 

Page.java

public class Page extends BasePage { 
    //do stuff 
} 

TestClass.java

public class TestClass extends Helper { 
    private Page page; 

    // I can use "center.click()" because TestClass extends from Helper, 
    // and "center" is a protected variable in Helper 
    // "center.click()" returns type 'BasePage' 
    // 'page' is a type 'Page' which extends 'BasePage' 
    // So why can't I put the result of "center.click()" into 'page' ? 
    page = center.click(); 

} 
+2

你的問題是什麼? –

+0

你有什麼錯誤嗎? – kosa

+1

您不能將超類引用分配給子類引用。 –

回答

3

藉此例如:

Subclass inherits from Superclass 

Subclass sub; 

sub = new Superclass(); // is not valid 

Superclass super = new Subclass(); // is valid 
// basic laws of polymorphism 

理解它是最簡單的方法,該容器應該比對象的被存儲的類型大。在這種情況下,超類大於子類,這就是爲什麼第二種說法是正確的。

如果您需要通過任何方式使用第一條語句,請嘗試投射。

sub = (Subclass)(new Superclass()); // is valid 
1

兩個問題。首先,page = center.click();似乎不在方法內。 (如果它實際上是不是在你的代碼中,首先解決這個問題。)

然後,分配仍然無法工作,因爲BasePagecenter.click()回報可能不是Page一個實例。 (其實,事實並非如此。)

進行下列替換你的代碼CenterTestClass

BasePage =>Object
Page =>String

它不應該再清楚爲什麼有問題。

1

這是因爲您無法將超類對象分配給子類對象。假設你的代碼是正確的,在你的Center.click()方法中,你將返回一個新的BasePage對象。 PageBasePage的子類,該分配無法工作。

您將不得不返回一個類爲PagePage的子類,然後將其類型轉換爲Page

2
page = center.click(); 

pagebaseclass Page,而你的方法center.click()返回類型的超類BasePage的對象的引用。

您不能指定將超類對象分配給子類引用。

您需要明確強制轉換您的BasePagePage: -

page = (Page)center.click(); 

但是,由於,你是從你的方法,這是不是Page實例返回new BasePage(this)也可能無法工作。

您需要返回Page類型的對象,而喜歡: - new Page(this),您可以強制轉換分配給參考頁..

而且,你是直接做class這裏面的分配是不正確的。要麼你需要有一個方法,或者你需要在聲明時初始化它..

Page page = (Page)center.click(); 
+0

我不確定,但我想有人低估了你,因爲click()返回一個「新的BasePage(this)」。這不能鑄成一個頁面(因爲它不是一個)。 – Pablo

+0

@Pablo好的。我之前沒有看到。相應地修改我的帖子。謝謝 :) –