代码之家  ›  专栏  ›  技术社区  ›  deepakguna

如何在内部类中调用继承的类构造函数

  •  0
  • deepakguna  · 技术社区  · 7 年前

    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.
             }
        }
    }
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   GhostCat    7 年前

    以下问题的答案:

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

    InnerClass 不是吗 静止的 内部类 不能“独自”存在。创建实例的唯一方法 第一 创建的实例 OuterClass .

    可以创建对象(它们的构造函数代码正在执行)-调用超类的构造函数没有意义。因为 内部类 没有超类(除了Object)。调用封闭函数的构造函数是没有意义的 外部类 -因为那样 对象已存在!

    或者,通过代码解释:

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

    引导:退一步,看看你的模型。乍一看,这没有多大意义。

    内部类 延伸 对象它有 直接的 与的关系 BaseClass 内部类 外部类 对象-并且该对象扩展 基类

        2
  •  1
  •   Yegor Kozlov    7 年前

    从基类扩展InnerClass,您会很好。下面是代码的一个稍微修改的版本:

        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
            }
        }
    

    如果您不想从基类扩展InnerClass,那么将初始化逻辑移动到init(字符串驱动程序)方法中,并通过基类调用它。这初始化(驱动程序):

    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);
                }
            }
    
        }
    }