继承最佳实践Java

继承最佳实践Java,java,inheritance,Java,Inheritance,假设我有一个具有属性的父类发射器 private double launchAngle; private double launchAngleVariation; 还有一个构造器 public Emitter(double launchAngle, double launchAngleVariation) { this.launchAngle = launchAngle; this.launchAngleVariation = launchAngleVariation; } public

假设我有一个具有属性的父类发射器

private double launchAngle;
private double launchAngleVariation;
还有一个构造器

public Emitter(double launchAngle, double launchAngleVariation)
{ this.launchAngle = launchAngle;
  this.launchAngleVariation = launchAngleVariation;
}
public MobileEmitter(double launchAngle, int a)
{ super();   //how should this be handled?
  this.a = a;}
和一个子类MobileEmitter,具有属性

private int a;
还有一个构造器

public Emitter(double launchAngle, double launchAngleVariation)
{ this.launchAngle = launchAngle;
  this.launchAngleVariation = launchAngleVariation;
}
public MobileEmitter(double launchAngle, int a)
{ super();   //how should this be handled?
  this.a = a;}
我的问题是,处理超级电话的最佳方式是什么

我是否应该在父类中创建一个空构造函数,并使launchAngle受保护,以便可以直接在子构造函数中赋值

或者在父类中创建一个单独的构造函数,将launchAngle作为参数,然后调用
super(launchAngle)更好吗


这就是我认为你需要的。超级调用必须具有分配给它的某些值。在您的例子中,您正在调用Emitter类(父类)中的默认构造函数。

这更像是一个样式问题,而不是代码问题,因此可能更适合另一个stackexchange站点。就个人而言,我会说创建一个构造函数
Emitter(launchAngle)
——因为Emitter拥有字段launchAngle,所以让Emitter设置您可能想要提交代码的字段感觉更好。我不会在
发射器中添加构造函数,只是因为这个原因,如果它没有意义的话。我也不会将属性设置为
protected
。我宁愿使用受保护的setter或
super(launchAngle,0)
。MobileEmitter
的发射角度变化是什么?
a
代表什么?它只是
MobileEmitter
本地的任意参数,用于demonstration@standelaune在构造函数中调用可重写方法(即受保护的setter)会导致许多非常不愉快的错误: