7

いくつか検索した後、コピーコンストラクターと継承に関する私の質問に対する良い答えが見つかりませんでした。User と Trainee の 2 つのクラスがあります。Trainee は User から継承し、2 つの String パラメータが Trainee に追加されます。これで User のコピー コンストラクターを作成できましたが、Tranee のコピー コンストラクターには満足できません。ユーザー コピー コンストラクターのコードは次のようになります。

public User (User clone) {
    this(clone.getId(), 
         clone.getCivilite(),
         clone.getNom(), 
         clone.getPrenom(), 
         clone.getEmail(), 
         clone.getLogin(), 
         clone.getTel(), 
         clone.getPortable(), 
         clone.getInscription(), 
         clone.getPw()
    );
}

Trainee コピー コンストラクターで super を使用しようとしました。

public Trainee (Trainee clone) {
    super (clone);
    this (clone.getOsia(), clone.getDateNaiss());
}

しかし、それは機能せず、完全なバージョンのコピー コンストラクターをコーディングする必要がありました。

public Trainee (Trainee clone) {
    this(clone.getId(), 
         clone.getCivilite(),
         clone.getNom(),
         clone.getPrenom(), 
         clone.getEmail(), 
         clone.getLogin(), 
         clone.getTel(), 
         clone.getPortable(), 
         clone.getInscription(), 
         clone.getPw(), 
         clone.getOsia(), 
         clone.getDateNaiss()
    );
}

メインの構築のため、新しいインスタンスを次のようにキャストする必要があります。

  User train = new Trainee();
  User train2 = new Trainee((Trainee) train);

だから私の質問は:これを行うためのよりクリーンな方法はありますか? スーパー使えないの?

ご回答とご支援をよろしくお願いいたします。

4

2 に答える 2

10

の「完全な」コピー コンストラクターTraineeも次の値を取るようにすることをお勧めしUserます。

public Trainee(Trainee clone)
{
    this(clone, clone.getOsai(), clone.getDateNaiss());
}

public Trainee(User clone, String osai, String dateNaiss)
{
    super(clone);
    this.osai = osai;
    this.dateNaiss;
}

可能な限り、各クラスに 1 つの「マスター」コンストラクターを持ち、他のすべてのコンストラクターが直接的または間接的にチェーンするというパターンを維持する価値があります。

現在、既存のユーザー情報を指定Trainee せずに を作成することが理にかなっているのか、それとも別の方法で指定することが理にかなっているのかは明らかではありません。この場合、実際には 2 つの別個のコンストラクターのセットが必要になる可能性がありますそれは本当にあなたの文脈に依存します - これだけではわかりません.

その場合、「マスター コンストラクターは 1 つ」という規則に少し違反することになりますが、目的が異なるコンストラクターのセットごとに 1 つずつ、合計2 つのマスター コンストラクターがあると考えることができます。基本的に、「継承が乱雑になる」ことに遭遇しています-これはあまりにも一般的です:(

于 2012-11-29T21:33:38.637 に答える
0

私はします:

 public Trainee (User clone) // By specifying `User` you allow the use in your code
 {
    super (clone);
    if (clone instanceof Trainee) {
      this.osia = clone.getOsia();
      this.dateNaiss = clone.getDateNaiss());
    }
 }
于 2012-11-29T21:34:25.523 に答える