2017-11-02 9 views
2

User.java(抽象クラ​​ス)は、従業員オブジェクトを取り込み、にそれを行うpromoteEmployee方法における基本的類似のオブジェクトタイプをどのように変更しますか?

public abstract class User { 

    private int id; 

    public int getId() { 
    return this.id; 
    } 

    public void setId(int id) { 
    this.id = int; 
    } 
} 

Admin.java

public class Admin extends User { 

    public Admin(int id) { 
    super.setId(id); 
    } 

    public void promoteEmployee(Employee employee) { 
    // How would I change the employee object into an admin object? 
    } 

} 

Employee.java

public class Employee extends User { 

    public Employee(int id) { 

    super.setId(id); 

    } 


} 

管理オブジェクトあなたはどうしますか?

基本的に

Employee employee = new Employee(); 

私はそれはそれは別のサブクラスとしてサブクラスをキャストすることはできません

Admin employee = new Admin(); 
+0

オブジェクトを作成した後は、そのオブジェクトをあるタイプから別のタイプに変更することはできません。 –

+0

メソッドの説明: "このプロモーションは現在のオブジェクトを破棄し、管理者を表す新しいオブジェクトを読み込みます。"あなたはどうやって新しいものを作りますか?私は同じ変数名のエラーを取得し続ける –

+0

なぜあなたも管理クラスが必要ですか?あなたのコードで 'if(user instanceof Admin)'を使ったことがあるならば、それは非常に悪いデザインです。たとえば、型enum。 –

答えて

0
ここ

EmployeeAdminとして皆をキープ 両方Userの子クラスです。クラスEmployeeAdminの間には関係(IS-A関係)はありません。

オブジェクトEmployeeおよびAdminクラスは、クラスUserで保持することができます。 EmployeeAdminの間にこのようなことはできません。

あなたのコードに書いたコードは、あなたが望む目標を達成します。

次に、次の編集で目標を達成するためにコードにいくつか変更を加えることをおすすめします。

public class Admin extends Employee { // change the super class from User to Employee. 

    public Admin(int id) { 
    super.setId(id); 
    } 

    public void promoteEmployee(Employee employee) { 
    // How would I change the employee object into an admin object? 
    } 

} 

は今ここにAdminEmployeeとの関係です。これはAdminEmployeeの間の正しい関係です。各AdminはそれぞれEmployeeであるためです。

0

に変身します。 ただし、同じ親クラスを拡張することができます。 Userすなわち

User bob = new Employee(2); 
User manager = new Admin(1); 
bob = new Admin(bob.getId()) // this works! 
+0

これは機能しますが、これは正しいデザインパターンではありません。エンティティクラス間の正しい関係を定義していません。ありがとうございました :) –

1

この問題は、主にpatternsに属します。

最初。Builder Patternを使用すると、に基づいて新しいEmployeeを作成できます。 (例えば、new Employee(admin)を使用)

秒。あなたはAdminEmployeeの両方にoneクラスを使用し、単にEmployeeAdminを変更するState Patternを使用することができます。この場合、新しいオブジェクトを作成せず、オブジェクトを両方向に素早く変更することができます(または、Userのインスタンスがさらにあるかもしれません)。

どちらの方法も賛否両論があります。すべてあなたの目標に依存します。私の練習では、AdminEmployeeに追加の権利がありますので、の場合はboolean adminのパラメータで十分でしょう。

関連する問題