[英]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中继承:
唯一的准异常是默认的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.