当我需要更改对象的类型时,有没有一种优雅的方法来重新创建对象?

问题描述 投票:0回答:1

我的一个练习任务是让战士参加任务,以及一个可以计数/过滤/跟踪战士和任务的聚合器类。

我有一个 Fighter 抽象类和三种不同类型的战士(初级、中级和高级),它们继承了这个具有多个字段的抽象类。

该计划应该能够将拳手提升到更高的级别——初级到中级和中级到高级。我知道在初始化后不可能更改对象的类型,但是是否有比我当前的解决方案更好/更优雅的解决方案?即,我创建一个更高级别战斗机的新对象,将原始对象的数据复制到其中,然后删除原始对象。

java class object abstract
1个回答
0
投票

正如评论的,听起来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.
© www.soinside.com 2019 - 2024. All rights reserved.