2012-04-02 3 views
5

В принципе, у меня есть:ява подкласс: несколько конструкторов наследуется от абстрактного суперкласса

public abstract class AbstractClass { 
    public AbstractClass(Type arg0, Type arg1, Type arg2) { 
     // do some stuff with all those args 
    } 

    public AbstractClass(Type onlyOneArg) { 
     // do different stuffs with this different arg. 
    } 

    protected someMethods() { /* ... */ } 
} 

И у меня есть несколько проблем в подклассы:

  • во-первых, я должен -в большинство из случаи - бесполезно переписывают конструкторы. Не очень раздражает, просто немного грязно для глаз.
  • И, более важно, я не вынужден реализовать как конструкторы (хотя оба они используются в программе).

Пример моих текущих подклассов:

public class MyClass extends AbstractClass { 
    public MyClass(Type arg0, Type arg1, Type arg2) { 
     super(arg0, arg1, arg2); 
    } 

    public MyClass(Type onlyOneArg) { 
     super(onlyOneArg); 
    } 
} 

И

  • я должен быть в состоянии написать некоторый конкретный код в конструкторе подкласса, если я хочу.
  • У меня слишком много общего кода, который я хочу сохранить в абстрактном классе.

Могу ли я что-то сделать? Есть ли что-то, что я не знаю о Java? Или мой дизайн плохой? Или.. ?

+1

Не уверен, в чем вопрос. Вы хотите, чтобы вас заставили реализовать все конструкторы суперклассов? Что это о требованиях, которые вы заявили, что вы не можете сделать? –

+0

Я был бы счастлив переформулировать вопрос, но я не совсем уверен, как .. Я имел в виду, что хочу быть уверенным, что в каждом подклассе 'AbstractClass' оба конструктора доступны. В программе я создаю экземпляр с обоими конструкторами, не зная точного типа.Я знаю только, что объект будет подклассом 'AbstractClass'. Поэтому я должен быть уверен, что всегда могу использовать оба конструктора. Это более понятно? ... Sry, трудно выразить свои мысли по-английски! – user978548

+0

Кроме того, мне также было интересно, возможно ли каким-либо образом для java автоматически использовать конструктор 'AbstractClass', если он не определен в подклассе, но это не моя основная проблема. – user978548

ответ

1

Подкласс должен вызвать либо один (или оба, если вы переопределите оба, как в вашем примере) конструкторов суперкласса; но вы не можете заставить его переопределить конструкторы с теми же сигнатурами суперкласса.

Единственный способ гарантировать, что суперкласс конструктор называется должен иметь только один конструктор суперкласса.

Я думаю, вы должны подумать о том, как изменить свой суперкласс (возможно, создать 2 класса), чтобы иметь только один конструктор, если вы хотите, чтобы он всегда вызывал.

Но если вы хотите, чтобы конкретный конструктор присутствовал в подклассе, вы должны изолировать проблему «строительства» на заводе; где вы можете иметь специальные фабричные классы для каждого из ваших подклассов. Ваши заводы реализуют этот интерфейс:

interface AbstractClassFactory { 
    AbstractClass create(Type arg0, Type arg1, Type arg2); 
    AbstractClass create(Type onlyOneArg); 
} 
+0

Немного связанный с этим вопрос: Я только что протестировал в Eclipse и увидел, что я могу поместить интерфейс фабрики вложенный в абстрактный класс, и каждый завод подкласса вложен в качестве вложенного класса в свой класс без проблем. Это плохая практика? – user978548

+0

@ user978548: Не обязательно, это может смутить ваших пользователей. Кроме того, ваш вложенный заводский интерфейс и классы должны быть ['static'] (http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html). –

0

Конструкторы не наследуются на Java. Иногда это может раздражать, но это так. Я не понимаю, почему вы хотите, чтобы каждый подкласс реализовал оба конструктора. Вы пишете «В программе я создаю экземпляр с обоими конструкторами, не зная точного типа». Что ты имеешь в виду? Вы не можете создать экземпляр абстрактного класса, вам нужно знать, какой конкретный тип вы создаете «новым». Если вы используете отражение, вы можете проверить доступные конструкторы во время выполнения.

+0

Я использую отражение, но потребность в другом конструкторе связана с использованием конечного пользователя. Но я буду использовать фабрику вместо конструкторов. – user978548

Смежные вопросы