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

how to call inherited class constructor in the inner class

我需要在内部 class 中调用继承的 class 构造函数。假设我有继承 Baseclass 的 Outerclass,并且我在 Outerclass 中有一个内部 class。我需要从这个内部 class 的构造函数调用 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.
         }
    }
}

答案:

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

。请记住:InnerClass 不是 static。这意味着:InnerClass 的对象不能存在 "on their own"。创建 InnerClass 实例的唯一方法是 首先 创建 OuterClass 实例。

在可以创建 InnerClass 个对象的时间点(正在执行它们的构造函数代码)- 调用超级 class 的构造函数没有意义。因为 InnerClass 没有 superclass (除了 Object)。并且调用封闭 OuterClass 的构造函数没有意义 - 因为 OuterClass 对象已经存在!

或者,代码解释:

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

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

并解决 OP 的评论:InnerClass extends 对象!它与 BaseClass 直接 关系。除了任何 InnerClass 对象都属于 OuterClass 对象这一事实 - 并且该对象扩展 BaseClass!

从 BaseClass 扩展 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
        }
    }

如果您不想从 BaseClass 扩展 InnerClass,则将初始化逻辑移动到 init(String driver) 方法中并通过 BaseClass.this.init(driver):

调用它
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);
            }
        }

    }
}