Rozwiązanie dziedziczenia w javie

0

Witam.
Mam pytanie dotyczące zamodelowania pewnego problemu. Chcę stworzyć trzy klasy z takimi zmiennymi:
Klasa U extends Bazowa
{
int p;
int l;
}
Klasa B extends Bazowa
{
int l;
int h;
}
Klasa J extends Bazowa
{
int h;
}

Klasa B i J ma wspólną zmienną "h" oraz klasa U i B ma wspólną zmienną "l". Wszystkie te obiekty są podobne pod względem zachowania (metody) więc z implementacją interfejsów nie będzie tutaj problemu bo w Javie można implementować wiele interfejsow, jednak rozróżniają je zmienne tak, że nie potrafię powiedzieć, jakie zmienne powinna przechowywać klasa bazowa dla tych klas, czy zmienną "l" czy "h". A może w ogóle nie robić klasy bazowej tylko dublować zmienną "l" i "h" w tych klasach tzn. zostawić tak jak to jest powyżej napisane? Czekam na odpowiedzi.

0

Możesz tak zostawić. W zależności od tego, na jaką Klasę rzucisz, do pola z tej klasy odnosić się będziesz.
Przykład

public class A {

	public int i;
}
public class B extends A {

	public int i;
}
		A a=new B();
		B b=(B) a;
		
		a.i=4;
		b.i=10;
		
		System.out.println(a.i);
		System.out.println(b.i);

stdOUT->
4
10

0

Nie wiem co chcesz uzyskać, ale jeśli w klasie bazowej i pochodnej masz zmienne o tych samych nazwach to w instancji klasy pochodnej będziesz miał dwa pola, do których będziesz mógł się odwołać bezpośrednio. Przestudiuj ten kod: http://ideone.com/uufnI

edit:
@Antoniossss mnie ubiegł

0

Chodzi mi o to którą zmienną czy "l" czy "h" wrzucić do klasy bazowej. Wiadomo, że jak wrzucę l do bazowej, to z klasy U oraz B usunę tą zmienną bo nie chcę żeby w bazowej i i pochodnej klasie była ta sama nazwa zmiennej. Problem polega na tym, że jak wrzucę "l" do bazowej, to wtedy zmienna "h" występuje w klasie B i J. Jeśli zaś wrzucę do klasy bazowej zmienną "h", to wtedy zmienna l będzie w klasie B i U. A nie mogę wrzucić zmiennej "l" i "h" do klasy bazowej, bo np. klasa U nie może posiadać zmiennej h. Mam nadzieje że rozumiecie o co chodzi.

0

Szczerze ? Nie
Dobra jak chcesz mieć taką selektywność to zrób to na interfejsach i już. Poza tym, tak jak z @Wibowit stwierdziliśmy, nie będzie konfliktu zmiennych. Jak sobie zmienną zadeklarujesz jako B to będziesz miał dostęp tylko do B#i. W sumie nie ma żadnego problemu - nie generuj go proszę :)

0

Nie ma żadnego problemu z używaniem tych samych nazw zmiennych z różnych klas. Nie trzeba też koniecznie bawić się w nieładne pseudo-konwersje, które zaciemniają tylko kod.
Jeżeli masz dwa pola z różnych klas bazowych i jeszcze kolejne w bieżącej klasie, to możesz do nich się odwołać na kupę różnych sposobów:
this.h - pole w bieżącym obiekcie
B.this.h - pole w konkretnej klasie mającej coś wspólnego z bieżącym obiektem (najczęściej używane z lub do klasy wewnętrznej)
J.this.h - pole w innej klasie mającej coś wspólnego z bieżącym obiektem (najczęściej używane z lub do klasy wewnętrznej)
super.h - pole w najbliższej bazie
B.super.h - pole w konkretnej klasie bazowej B
J.super.h - pole w konkretnej klasie bazowej J

1 użytkowników online, w tym zalogowanych: 0, gości: 1