2

私は2つのクラスを持っていPersonますEmployee. Employee伸びPersonます。

Personストレージからを読み取るメソッドがあり、 を読み取るメソッドを作成していますEmployee

Personコードをコピーして貼り付けることなく、 と同じプロパティを読み取るために持っているメソッドを再利用したいのEmployeeですが、それを行う方法が見つからないようです。

public Person getPersonFromStorage() {
    Person person = new Person();
    // ... logic
    return person;
}

public Employee getEmployeeFromStorage() {
    Employee employee = new Employee();
    // ... logic for employee-specific fields

    // I want to read the fields inherited from Person here
    return employee;
}

ではないため、から取得Personしたをキャストできません。別のサブタイプでもないため、そうである可能性がありますが、そうではありません。getPersonFromStorageEmployee

私は次のことができます:

public Person getPersonFromStorage(Person person) {
    if(person==null) { person = new Person(); }
    // ... logic
    return person;
}

public Employee getEmployeeFromStorage() {
    Employee employee = (Employee) getPersonFromStorage(new Employee());
    // ... logic for employee-specific fields
    return employee;
}

しかし、できればこの複雑さは避けたいと思います。初歩的なことを見落としているような気がします。これを解決するより良い方法はありますか?

4

4 に答える 4

1

よりエレガントな方法は、コンストラクターをオーバーロードして、親インスタンスからインスタンスEmployeeを作成できるようにすることです。EmployeePerson

public Employee getEmployeeFromStorage() {
    Employee employee = new Employee(getPersonFromStorage());
    // ... logic for employee-specific fields
    return employee;
}
于 2013-10-07T15:16:54.403 に答える
1

nullチェック行さえ必要ないことを除いて、2番目のコード例は行くべき道です。Person他の場所でインスタンス化したnull 以外を渡すだけです。

Personより良い抽象化のために、abstractクラスにできるかどうかを確認してください。

于 2013-10-07T15:10:23.257 に答える
0

保護されたファクトリ メソッドを使用できます。

protected Person createNewInstance() { return new Person(); }

これを getPersonFromStorage() メソッドで使用します。サブクラスはこのメソッドをオーバーライドし、戻り値の型を Employee に変更します。これは、2 番目の例のように使用できます。

public class Person {

    public Person getPersonFromStorage() {
        Person person = createNewInstance();
        // ... logic
        return person;
    }

    protected Person createNewInstance() {
        return new Person();
    }
}

public class Employee extends Person {

    public Employee getEmployeeFromStorage() {
        Employee employee = (Employee) getPersonFromStorage();
        // ... logic for employee-specific fields
        return employee;
    }

    protected Person createNewInstance() {
        return new Employee();
    }
}

または、 Person に基づいて Employee コンストラクターを作成することもできます

public class Employee extends Person {
    public Employee(Person person) {
        super();
        // copy all fields from person 
    }

    public static Employee getEmployeeFromStorage() {
        Employee employee = new Employee(getPersonFromStorage());
        // ... logic for employee-specific fields
        return employee;
    }
}

また、既存のオブジェクトと直接関係のない新しいインスタンスを作成するつもりだと仮定して、メソッドに static を追加しました。これは、最初のバリアントでは機能しません。

于 2013-10-07T15:37:15.900 に答える