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

时间:2018-04-06 11:15:10

标签: java oop inheritance abstract-class superclass

这样的事情可能

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?

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

如果我跳过为抽象类的子类编写构造函数(这是否允许?)抽象类'构造函数默认使用?

4 个答案:

答案 0 :(得分:1)

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

其次,在SubClass内,您无法拨打this.entity.doVoidMethod();。这是因为entity属性在基类中是私有的,因此SubClass无法访问。

此外,您在AbstractSuperClass内定义了public abstract Operate();。你可能意味着public abstract void operate();。 SubClass中也存在类似的错误。

答案 1 :(得分:1)

  

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

你不能。构造函数不是用Java继承的:

  

Java Constructor Inheritance

唯一的例外是default constructor。但严格来说,它不是继承。如果没有构造函数,则添加默认构造函数,它将调用>>> print(True and False) and (True or False) False # <-- from print, None doesn't get printed >>> print(print(True and False) and (True or False)) False # <-- from the inner print None # <-- None gets printed by the outer print >>>

  

如果我跳过为抽象类的子类编写构造函数(这是否允许?)抽象类&#39;构造函数默认使用?

没有。超类的构造函数既不是继承的,也不是复制的。

答案 2 :(得分:-1)

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

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关键字。

答案 3 :(得分:-1)

一些想法(1)你应该让实体&#34;受保护&#34;而不是&#34;私人&#34; - 那就是你如何在子类中使它,(2)它有助于使用可以由子类继承的访问器方法(getter / setter),这与非默认构造函数不同,(3)操作方法需要返回type(我在下面使用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()
相关问题