2011-07-19 15 views
5

Sytuacja jest chcę dziedziczyć obiekt mieć czystsze interfejsu Konstruktor:Dziedziczenie klasy z argumentów konstruktora w java

class BaseClass { 
    public BaseClass(SomeObject object){ 
     ... 
    } 
} 

class SubClass extends BaseClass{ 
    private SubObject subObject = new SubObject(); 
    public SubClass(){ 
     super(new SomeObject(subObject)); // doesn't compile 
    } 
} 

Ale aby to zrobić muszę robić rzeczy przed konstruktora jak w przykładzie powyżej, ale nie może, ponieważ Java nie pozwala na to. Czy jest jakiś sposób obejścia tego? Zaczynam czuć, że jeśli twoja klasa ma być poddana subklasie, powinna zawsze implementować domyślny konstruktor i zapewniać settery dla wartości, których potrzebuje ... Czasami możesz uciec, jeśli utworzysz nowy obiekt prosto do super konstruktora jako argument, ale jeśli potrzebujesz odniesienia do obiektu, który utworzyłeś, to jesteś hosed.

+1

Jaki jest błąd kompilacji? –

+0

nie może odwoływać się do obiektu podrzędnego przed nadtypem konstruktora o nazwie – palto

+0

* Nie można odwoływać się do obiektu podrzędnego instancji podczas jawnego wywoływania konstruktora * –

Odpowiedz

4

Należy go zmienić, aby nie odnosić się do członka instancji w wywołaniu superkonstruktora. Niestety, jeśli musisz "zapisać" SubObject, staje się trudne. Myślę, że musiałbyś zrobić to z łańcuchem konstruktora:

class SubClass extends BaseClass{ 
    private SubObject subObject; 

    public SubClass() { 
     this(new SubObject()); 
    } 

    private SubClass(SubObject subObject) { 
     super(new SomeObject(subObject)); 
     this.subObject = subObject; 
    } 
} 
0
public SubClass(){ 
    super(new SomeObject(new SubObject())); // this should compile 
} 

Teraz w super klasy, zrób coś takiego:

private final SomeObject foo; 
public BaseClass(SomeObject foo){ 
    this.foo = foo; 
} 
public /* or protected */ SomeObject getFoo(){return this.foo;} 
+0

Nie można odwoływać się do obiektu SubObject w ten sposób – palto

+1

'super' pobiera' SomeObject' jako parametr a nie "SubObject' –

+0

Zgadza się, ale możesz dostać to od nadklasy przez akcesor, zobacz moją aktualizację –

0

Niezupełnie odpowiedź ponieważ nie miałoby SubClass, ale można użyć fabryki.

Powiązane problemy