Экземпляр суперкласса мелкой копии Java для экземпляра подкласса

Я хочу передать экземпляр суперкласса конструктору подкласса. Моей первой идеей было заменить экземпляр суперкласса на подкласс, аналогичный прототипам javascripts, но мне сказали здесь, что Java не поддерживает замену ссылки на суперэкземпляр, потому что суперэкземпляра как такового нет.

Чтобы обойти эту проблему, я хочу использовать конструктор копирования, который принимает экземпляр суперкласса. Затем мне придется повторно связать все ссылки вручную, что в конечном итоге вызовет ошибки, когда другие люди расширят код суперкласса и забудут конструктор копирования в подклассе.

Вопрос. Есть ли какой-нибудь удобный и удобный способ автоматического копирования всех ссылок, возможно, с помощью какого-то механизма отражения для предотвращения ошибок в будущем?


person Franz Kafka    schedule 29.12.2011    source источник
comment
Я не уверен, понимаю ли я, что вы пытаетесь сделать здесь. Но использование super в подклассе даст вам доступ к суперклассу. public class A{ public void test(){ } } public class B extends A{ public B(){ super.test(); } }   -  person Dimitry    schedule 29.12.2011
comment
Уродливый вариант, работающий без конструктора, — clone(). go4expert.com/forums/showthread.php?t=5424   -  person Stefan    schedule 29.12.2011
comment
Наличие конструктора копирования в суперклассе и вызов этого конструктора копирования из конструктора копирования вашего подкласса не то, что вы ищете? Или я не совсем понимаю вашу проблему? Возможно, вопрос станет более ясным, если вы сможете описать, какую проблему вы пытаетесь решить.   -  person Robin    schedule 30.12.2011
comment
Да, проще иметь конструктор копирования непосредственно в суперклассе и вызывать его из подкласса. Но я думаю, что завтра я проведу рефакторинг и посмотрю, не поможет ли решение делегирующего интерфейса. Копирование конструктора или клонирование кажутся слишком грязными. Я действительно ожидал какого-то трюка с отражением.   -  person Franz Kafka    schedule 30.12.2011


Ответы (1)


Не следует копировать все ссылки из экземпляра суперкласса в экземпляр подкласса. Кстати, все эти ссылки не должны быть доступны даже из подкласса, если они объявлены как частные поля в суперклассе (как обычно и должно быть).

Что вам, вероятно, нужно, так это делегирование вместо наследования:

// Foo is the superclass
private class FooAdapter {
    private Foo foo;

    public FooAdapter(Foo foo) {
        this.foo = foo;
    }

    public void doThis() {
        return foo.doThis();
    }
}

FooAdapter может расширить Foo или (лучше) реализовать общий интерфейс, но это не обязательно.

Если это не решит вашу проблему, сообщите нам, что вы хотите сделать, вместо того, чтобы говорить нам, как вы хотите это сделать. Какую проблему вы хотите решить?

person JB Nizet    schedule 29.12.2011
comment
Да, вы понимаете мою проблему, но я не хочу делегировать, потому что в противном случае классы являются чистым наследованием. Это было бы просто тоннами дополнительного кода с делегированием функций одной строки другому экземпляру. Я действительно хочу извлечь общий интерфейс только в том случае, если сломанный клон - мой единственный вариант. Но я проверю код, возможно, чистый интерфейс сделает некоторые шаблоны доступа устаревшими и скомпилируется в аккуратный интерфейс. - person Franz Kafka; 29.12.2011