2012-10-20 8 views
10

Mam klasę abstrakcyjną, w której chcę zadeklarować zmienne końcowe.Jak zdefiniować stałe/ostateczne zmienne w abstrakcyjnych klasach nadrzędnych, ale przypisać je do podklasy?

Jednak chcę przypisać wartości do tych zmiennych tylko w konstruktorach moich podklas.

Najwyraźniej nie jest to możliwe, ponieważ wszystkie "ostatnie pola muszą zostać zainicjalizowane". Nie rozumiem dlaczego, skoro i tak nie jest możliwe stworzenie klasy abstrakcyjnej.

Co chciałbym mieć to coś takiego:

abstract class BaseClass { 
    protected final int a; 
} 

class SubClass extends BaseClass { 
    public SubClass() { 
     a = 6; 
    } 
} 

sobie wyobrazić coś podobnego do metod podczas implementować interfejs. Następnie jesteś zmuszony do wdrożenia metod w klasie (pod-).

+0

Jak ustawić 'a' w konkretnej podklasie zachowując ją' final'. – Jack

+0

jeśli ustawisz jako ostateczny, dlaczego potrzebujesz superklasy, aby ją zawrzeć? nie możesz po prostu zdefiniować go w podklasie? – Gianmarco

Odpowiedz

16

Należy zdefiniować konstruktor w klasie abstrakcyjnej, który ma wartość dla a i wywołać tego konstruktora z podklas. W ten sposób zapewnimy, że twój ostateczny atrybut będzie zawsze inicjowany.

abstract class BaseClass { 
    protected final int a; 

    protected BaseClass(int a) 
    { 
     this.a = a; 
    } 
} 

class SubClass extends BaseClass { 
    public SubClass() { 
     super(6); 
    } 
} 
+0

Wielkie dzięki, problem rozwiązany! – schrobe

Powiązane problemy