3

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

4 に答える 4

3

次の例を見てください。

Subclass inherits from Superclass

Subclass sub;

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

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

これを理解する最も簡単な方法は、コンテナーは格納するオブジェクトのタイプよりも大きくする必要があるということです。この場合、スーパークラスはサブクラスよりも大きいため、2 番目のステートメントは正しいです。

どうしても最初のステートメントを使用する必要がある場合は、キャストしてみてください。

sub = (Subclass)(new Superclass()); // is valid
于 2012-10-17T15:49:25.077 に答える
2
page = center.click();

Yourpageは の参照ですbaseclass Pageが、メソッドcenter.click()は super class 型のオブジェクトを返しますBasePage

スーパークラス オブジェクトをサブクラス参照に割り当てることはできません。

BasePage明示的に型キャストする必要がありますPage: -

page = (Page)center.click();

ただしnew BasePage(this)、 のインスタンスではないメソッドから戻っているため、これも機能しない可能性がありますPage

次のようなタイプのオブジェクトを返す必要がありますPage: - new Page(this)、型キャストして Page 参照に割り当てることができます。

classまた、この割り当てを直接内部で行っていますが、これは正しくありません。メソッドが必要か、宣言時にのみ初期化する必要があります。

Page page = (Page)center.click();
于 2012-10-17T15:47:55.917 に答える
1

2 つの問題。まず、page = center.click();メソッド内にあるようには見えません。(実際にコードに含まれていない場合は、最初に修正してください。)

BasePageその場合、center.click()返される は のインスタンスではない可能性があるため、割り当ては引き続き機能しませんPage。(実際にはそうではありません。)

Centerとのコードを次のように置き換えますTestClass

BasePage=> Object
Page=>String

なぜ問題があるのか​​ が明確になるはずです。

于 2012-10-17T15:47:15.903 に答える
1

これは、スーパークラス オブジェクトをサブクラス オブジェクトに割り当てることができないためです。コードが正しいと仮定すると、メソッドで新しいオブジェクトCenter.click()が返されます。は のサブクラスであり、その代入は機能しません。BasePagePageBasePage

Pageのまたはサブクラスであるクラスを返し、Pageそれを に型キャストする必要がありPageます。

于 2012-10-17T15:47:34.893 に答える