如何在内部 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);
}
}
}
}
我需要在内部 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);
}
}
}
}