我的一个练习任务是让战士参加任务,以及一个可以计数/过滤/跟踪战士和任务的聚合器类。
我有一个 Fighter 抽象类和三种不同类型的战士(初级、中级和高级),它们继承了这个具有多个字段的抽象类。
该计划应该能够将拳手提升到更高的级别——初级到中级和中级到高级。我知道在初始化后不可能更改对象的类型,但是是否有比我当前的解决方案更好/更优雅的解决方案?即,我创建一个更高级别战斗机的新对象,将原始对象的数据复制到其中,然后删除原始对象。
正如评论的,听起来rank应该只是你的
Fighter
类的属性。
不应使用继承,除非子类具有超类之外的其他数据或行为。
这是一个完整的示例类。我们将
Rank
定义为一个具有三个命名常量对象的枚举,即三个级别的等级。我们有一个 getter 和一个 setter 方法供您更改实例上的排名字段。
public final class Fighter
{
private final String name;
private final Rank rank;
enum Rank { JUNIOR, MEDIOR, SENIOR; }
public Fighter ( String name ,
Rank rank )
{
this.name = name;
this.rank = rank;
}
public String name ( )
{
return name;
}
public Rank getRank ( )
{
return rank;
}
public void setRank ( final Rank rank )
{
this.rank = rank;
}
// `Object` overrides.
@Override
public boolean equals ( Object obj )
{
if ( obj == this ) return true;
if ( obj == null || obj.getClass ( ) != this.getClass ( ) ) return false;
var that = ( Fighter ) obj;
return Objects.equals ( this.name , that.name ) &&
Objects.equals ( this.rank , that.rank );
}
@Override
public int hashCode ( )
{
return Objects.hash ( name , rank );
}
@Override
public String toString ( )
{
return "Fighter[" +
"name=" + name + ", " +
"rank=" + rank + ']';
}
}
用途:
Fighter alice = new Fighter ( "Alice" , Fighter.Rank.MEDIOR ) ;
alice.setRank( Rank.SENIOR ) ; // Alice earned a promotion.