Как конструктор копирования Sub2 может автоматически копировать новые переменные-члены из Sub1? - PullRequest
1 голос
/ 13 августа 2011

Цель Sub2 - сохранить моментальный снимок во времени свойств Sub1.

например:

subService.update(sub1);
Sub2 sub2 = new Sub2(sub1);
subService.save(sub2);  

Проблема с реализацией ниже заключается в том, что всякий раз, когда новыйПеременные-члены добавляются в Sub1, программист должен помнить об изменении конструктора копирования в Sub2 для копирования новых членов из Sub1 в Sub2 .

Как конструктор копирования Sub2 автоматически копирует новоепеременные-члены из Sub1?

Базовый класс для Sub1 и Sub2:

public class Base{

    protected String a;
    protected String b;
    protected String c;
    // ...
    protected String z;

}

Sub1:

public class Sub1 extends Base {

    public Sub1(

        String a, 
        String b, 
        String c, 
        // ...
        String z){

        this.a = a;
        this.b = b;
        this.c = c;
        // ...
        this.z = z;

    }

}

Sub2:

public class Sub2 extends Base {

    public Sub2(Sub1 s1){

        this.a = s1.getA();
        this.b = s1.getB();
        this.c = s1.getC();
        // ...
        this.z = s1.getZ();         

    }


}

Ответы [ 2 ]

0 голосов
/ 13 августа 2011

Реализовать метод public sub1 copy () для Sub1 (или реализовать Cloneable).Когда вам нужен снимок экземпляра Sub1, просто вызовите copy () или clone ().Избавьтесь от Base / Sub2.

0 голосов
/ 13 августа 2011

В Java нет специального понятия для конструктора копирования, как в C ++, поэтому это просто еще один конструктор с аргументом.Вы не можете знать, какие члены есть у класса во время выполнения, не используя отражение, однако я бы посоветовал сделать Sub1 ответственным за сохранение его текущего состояния.Например, добавьте метод store в Sub1, который будет возвращать массив Strings (его членов).Тогда Sub2 может где-то хранить эти массивы.Когда вы добавляете новый элемент в Sub1, измените также метод хранения Sub1.Таким образом, вам не нужно трогать Sub1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...