Java扩展类

时间:2012-10-17 15:45:08

标签: java inheritance

BasePage.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();

}

4 个答案:

答案 0 :(得分:3)

举个例子:

Subclass inherits from Superclass

Subclass sub;

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

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

理解它的最简单方法是,容器应该大于它所存储的对象类型。在这种情况下,Superclass比Subclass大,这就是第二个语句正确的原因。

如果您需要以任何方式使用第一个语句,请尝试强制转换。

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

答案 1 :(得分:2)

page = center.click();

您的pagebaseclass Page的引用,而您的方法center.click()会返回超类BasePage类型的对象。

您不能将超类对象分配给子类引用。

您需要明确指定BasePagePage: -

page = (Page)center.click();

但这也可能无效,因为,您将从您的方法返回new BasePage(this),该方法不是Page的实例。

您需要返回Page类型的对象,而不是: - new Page(this),您可以将其转换为分配给页面引用。

此外,您正在class内直接执行此任务,这是不正确的。您需要有一个方法,或者您只需要在声明时初始化它。

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

答案 2 :(得分:1)

两个问题。首先,page = center.click();似乎不在方法内。 (如果它实际上不在您的代码中,请先修复它。)

然后,分配仍然无效,因为BasePage返回的center.click()可能不是Page的实例。 (事实上​​,事实并非如此。)

CenterTestClass的代码进行以下替换:

  

BasePage => Object
  Page => String

然后应该清楚为什么会出现问题。

答案 3 :(得分:1)

那是因为你不能将超类对象分配给子类对象。假设您的代码是正确的,在Center.click()方法上,您将返回一个新的BasePage对象。 PageBasePage的子类,该分配无效。

您必须返回PagePage的子类,然后将其输入Page