繁体   English   中英

默认使用抽象超类的构造函数?

[英]use abstract superclass' constructor by default?

这样可能吗

abstract class AbstractSuperClass {
  private Entity entity;

  public AbstractSuperClass(Entity entity) {
    this.entity = entity;
  }

  public abstract void operate();
}

public class SubClass extends AbstractSuperClass {
  public void operate() {
    this.entity.doVoidMethod(); // is this.entity defined in instances of SubClass ?
  }
}

// ... somewhere else

Entity instantiatedEntity = new Entity();
SubClass instance = new SubClass(instantiatedEntity);
instance.operate(); // does this call this.entity.doVoidMethod() inside of instance?

我希望能够跳过正在编写的抽象类的子类中编写自己的构造函数。 所有构造函数在每个子类中都是相同的。

如果我跳过为抽象类的子类编写构造函数(甚至允许这样做?),默认情况下是否使用抽象类的构造函数?

首先,如果不定义构造函数,则考虑不带参数的默认构造函数。
换句话说,如果要使用new SubClass(instantiatedEntity); 您必须在SubClass中定义构造函数,该构造函数采用单个Entity类型的参数。
换句话说,如果要传递参数,则不能跳过编写自己的构造函数的操作。

其次,在您的SubClass ,您不能调用this.entity.doVoidMethod(); 这是因为entity属性在基类中是私有的,因此子类无法访问。

此外,在AbstractSuperClass您定义了public abstract Operate(); 您可能是说public abstract void operate(); 子类中也有类似的错误。

我希望能够跳过正在编写的抽象类的子类中编写自己的构造函数。 所有构造函数在每个子类中都是相同的。

你不能 构造函数未在Java中继承:

Java构造函数继承

唯一的准异常是默认的Constructor 但是严格来说,这不是继承。 如果没有构造函数,则添加默认构造函数,它将调用super()

如果我跳过为抽象类的子类编写构造函数(甚至允许这样做?),默认情况下是否使用抽象类的构造函数?

不可以。超类的构造函数既不继承也不复制。

根据上面的代码,您正在使用的子类是从抽象类扩展的。

abstract class A{
 A(){
  //todo: some work
 }
 abstract methodA();
 methodB(){
  //todo:something: implementation within the abstract class.
 }
}
class B extends A{
 B(){
 super(this);
  }

}

我相信要使用抽象构造函数,可以使用super关键字。

一些想法(1)您应该使实体成为“受保护的”实体,而不是“私有”的实体-这就是使它在子类中可用的方式;(2)它有助于使用访问方法(getter / setter),该方法可以被子类继承,而不是-defaul构造函数,(3)操作方法需要返回类型(我在下面用void表示),(4)操作方法需要相同的签名(类型敏感名称和参数类型)以覆盖(5),这是一个好习惯用@Override注释重写的方法。

public abstract class AbstractSuperClass {
  protected Entity entity;

  public AbstractSuperClass() {
  }

  public AbstractSuperClass(Entity entity) {
    this.entity = entity;
  }

  public setEntity(Entity entity) {
    this.entity = entity;
  }

  public abstract void operate();
}

public class SubClass extends AbstractSuperClass {
  @Override
  public void operate() {
    this.entity.doVoidMethod(); // protected entity is available in subclass
  }
}

// ... somewhere else
Entity instantiatedEntity = new Entity();
SubClass instance = new SubClass(); // default constructor
instance.setEntity(instantiatedEntity); // inherited method
instance.operate(); // yes calls entity.doVoidMethod()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM