2017-08-16 10 views
0

内部クラスに継承されたクラスコンストラクタを呼び出す必要があります。私はBaseclassを継承するOuterclassを持っていると私はOuterclassの内部クラスを持っていると言う。この内部クラスのコンストラクタから、私はBaseClassコンストラクタを呼び出す必要がありますか?内部クラスの継承クラスコンストラクタの呼び出し方法

public class BaseClass { 
    public BaseClass (WebDriver driver) 
    { 
     this.driver =driver; 
     PageFactory.initElements(new AjaxElementLocatorFactory(driver, maxTimeOutForElement), this);  
    } 
} 

public class OuterClass extends BaseClass { 
    OuterClass (WebDriver driver) 
    { 
     super(driver) 
    } 

    //Does something 

    public class InnerClass 
    { 
     InnerClass (WebDriver driver) 
     { 
      //is there a way to call Baseclass constructor super(driver) 
      //I don't want to call directly new AuthorLoginPage(driver) breaking 
      //my constructor chain. 
     } 
    } 
} 
+1

深刻な答えは:これをしないでください。だからあなたは知る必要はありません。しかし、私は下降音に同意しない。これは有効な質問ですが、私はこの実用的な有用性を考慮していますが、0に非常に近いです。 – GhostCat

+0

@Michaelこれは二重にネストされたクラスではありません。あなたが見ている場合、これは内部クラスのレベルが1つしかありません。 – deepakguna

+1

@Michael私はコードを再度フォーマットしました。これは二重にネストされたクラスではありません – deepakguna

答えて

2

答え:

//is there a way to call Baseclass constructor super(driver) 

ノーです。覚えておいてください:InnerClassではありません。です。つまり、InnerClassのオブジェクトは、「自分で」存在することはできません。 InnerClassのインスタンスを作成する唯一の方法は、最初にで、OuterClassというインスタンスを作成することです。

InnerClassのオブジェクトを作成できる(コンストラクタコードが実行されている)時点で、スーパークラスのコンストラクタを呼び出す時点はありません。 InnerClassにはスーパークラスがありません(Object以外)。また、OuterClassのコンストラクタを呼び出すことは意味がありません - そのOuterClassオブジェクトが既に存在するためです!

あるいは、コード経由説明:

OuterClass outer = new OuterClass(someDriver); 
OuterClass.InnerClass inner = outer.new InnerClass(someDriver); 

にリードする:バックステップ、およびお使いのモデルに見えます。最初のより深い視線ではあまり意味がありません。

OPのコメントに対処するには:InnerClassオブジェクト! なしBaseClassの関係があります。 InnerClassオブジェクトがOuterClassオブジェクトに属し、そのオブジェクトがBaseClassに属しているという事実の他に、

+1

だから、彼が望むのは、 'InnerClass'を静的にし、' BaseClass'を拡張することです。しかし、それはなぜ 'InnerClass'が単独のクラスとして存在しないのかという疑問を提起します。 – Michael

+1

@Michaelそれは私がその部分について話していない* - *偶然ではありません;-)逆に、私の更新された答えを見てください。 – GhostCat

+0

ありがとう、私は特に、セレンのページオブジェクトを構築するためにこの構造が必要です。 @マイケルはい私はそれを自分でクラスとして持つことができます。私が持っていた唯一の考えは、いくつかのdivがあるページ構造をモデル化することでした。 – deepakguna

1

BaseClassからInnerClassを拡張してください。 init(文字列ドライバ)メソッドに初期化ロジックを移動し、その後BaseClassのからInnerClassを拡張し、BaseClass.this.initを経由して、それを呼び出すにしたくない場合は

public static class BaseClass { 
     public BaseClass (String driver) 
     { 
      System.out.println(getClass().getSimpleName() + ": " + driver); 
     } 

     public class OuterClass extends BaseClass { 
      OuterClass (String driver) 
      { 
       super(driver); 
      } 
      //Does something 

      public class InnerClass extends BaseClass 
      { 
       InnerClass (String driver) 
       { 
        super(driver); 
        //is there a way to call Baseclass constructor super(driver) 
        //I don't want to call directly new AuthorLoginPage(driver) breaking 
        //my constructor chain. 
       } 
      } 

     } 

     public static void main(String[] args) { 
      BaseClass clz = new BaseClass("one").new OuterClass("two").new InnerClass("three"); 
      // prints 
      // BaseClass: one 
      // OuterClass: two 
      // InnerClass: three 
     } 
    } 

:ここにあなたのコードを少し変更したバージョンです(ドライバー):

public static class BaseClass { 
    public BaseClass (String driver) 
    { 
     init(driver); 
    } 


    public void init(String driver){ 
     System.out.println(getClass().getSimpleName() + ".init: " + driver); 

    } 

    public class OuterClass extends BaseClass { 
     OuterClass (String driver) 
     { 
      super(driver); 
     } 
     //Does something 

     public class InnerClass 
     { 
      InnerClass (String driver) 
      { 
       BaseClass.this.init(driver); 
      } 
     } 

    } 
} 
+0

ありがとうございます!私は同じことで終わった。 – deepakguna

関連する問題