[ EdmondDantes @ 09.03.2005. 19:48 ] @
Pozdrav.
Imam problem prilikom pristupanja natklasi neke klase, koja kao potklasu ima odredjenu klasu. Zanima me, kako se realizuje pristup natklasi iz potklase, koja je nasledjenja iz potklase natklase. Naime, klasa B je nasledjena iz klase A, a klasa C iz klase B. Problem - pristup klasi A iz klase C.
Hvala unapred !
[ tiranin @ 09.03.2005. 20:28 ] @
Prava pristupa se realizuju preko kljucnih reci

private
protected
public

To se odnosi kako na polja tako i na metode. Ako imas problem to je verovatno zato sto si stavio private. Ako su ti klase u istom paketu, onda ne moras nista da navedes, i to je nesto kao public u okviru istog paketa. I to vazi bez obzira na nivo nasledjivanja.
Mozes i da stavis kod ovde da se vidi sta je posredi.
[ EdmondDantes @ 09.03.2005. 21:06 ] @
Mozda bi "Pristupanje natklasama natklasa" bio prikladniji naziv teme. Ocigledno je doslo do nesporazuma.
Drugo, znam da je resenje stavljanja klasa u isti paket mnogo elegantije i prakticnije, ali ne i kada je u pitanju domaci zadatak =)
Dakle, pristupa se klasi A(natklase klase B) iz klase C(potklase klase B).
Hvala.
[ tiranin @ 09.03.2005. 21:39 ] @
Onda stavi
Code:
public ... metoda ili polje
i nema problema
[ _owl_ @ 10.03.2005. 00:24 ] @
Kljucna rec je: super.
Na primer:
Code:

class A {
   public void methodA() {
       System.out.println("A.methodA()");
   }
}
class B extends A {
   public void methodA() {
       super.methodA();  // obrati paznju
       System.out.println("B.methodA()");
   }
   public void methodB() {
       System.out.println("B.methodB()");
   }
}
[ filmil @ 10.03.2005. 08:21 ] @
Citat:
Kljucna rec je: super.
Kako god okreneš, ako se klasa deklariše kako treba, moguće je pristupiti nadklasama. Neki primer šta treba da se postigne bi dobro došao.

f
[ EdmondDantes @ 10.03.2005. 13:36 ] @
Ovako:

class A {
public void method();
.....
.....
}
class B extends A {
.....
.....
}
class C extends B {
...
...
}

Problem - kako pristupiti metodi method() (koja je u klasi A) iz klase C (ili konstruktoru, svejedno)! Ponavljam, mogucnost postavljanja klasa u isti paket nije dopustena.
Dakle, ne govorim o pristupanju klasi A iz klase B, vec iz klase C !!
Nadam se da je sada jasnije formulisano ono sto se trazi.
[ igyy @ 10.03.2005. 18:08 ] @
Jedno od rjesenja je da metodu method() u klasi A deklariras kao "static" o onda jednostavno u C klasi pozoveš metodu kao "A.method()"
[ me-tuzalem @ 10.03.2005. 19:28 ] @
I jeste jasno i nije jasno.
O ovome se može diskutovati i iz čisto programerskog ugla, kako nešto realizovati, ali i sa projektnog ugla šta nešto znači u objektno-orijentisanom smislu.
Idem prvo na OO.
Nasleđivanje, znači da je objekat klase B podvrsta klase A, a da je objekat klase C podvrsta klase B, a samim tim i klase A. Ono što može objekat klase A, mogu i B i C, isto ili malo drugačije. Ako B i C nisu redefinisali metodu method(), onda oni bez ikakvih problema imaju i to ponašanje, a ako su redefinisali, onda oni imaju samo ponašanje definisano njihovom metodom method(), i NEMAJU ponašanje objakata kase A!
O ovome bi moglo još naširoko, ali idem na programerski ugao.
Ako za metodu staviš pravo pristupa protected tada u potklasama možeš bez problema da koristiš metodu iz natklase.
Moj ti je savet da uvek na umu imaš OO razmišljanje, jer svaki drugi pristup te može dovesti do koda koji u prvom trenutku radi, ali vrlo brzo će pokazati svoje manjkavosti kada počneš da ga održavaš.
[ filmil @ 10.03.2005. 21:02 ] @
java.lang.Object ima metod String toString(), koga mogu da koriste sve klase bez obzira koje su „koleno“ u nasleđivanju i bez obzira kojem paketu pripadaju. Dakle, ono što OP želi sigurno može da se uradi, jer se naveliko koristi kod ispisivanja objekata.

Međutim, da bi klase definisane u nekom paketu bile dostupne klasama u drugom paketu, moraju da budu deklarisane kao public class a ne samo kao class.

PEBKAC.
f
[ Dragi Tata @ 10.03.2005. 21:15 ] @
Citat:
filmil: j
Međutim, da bi klase definisane u nekom paketu bile dostupne klasama u drugom paketu, moraju da budu deklarisane kao public class a ne samo kao class.

f


A zar ne može da se koristi refleksija da se ovo ograničenje zaobiđe?
[ _owl_ @ 10.03.2005. 22:34 ] @
Za nesto moze, za detalje:
Neke prljave upotrebe refleksije
[ filmil @ 11.03.2005. 00:10 ] @
Citat:
A zar ne može da se koristi refleksija da se ovo ograničenje zaobiđe?
Fakat. Ali na refleksiju izgleda nikada neću uspeti da se naviknem (nikad ne reci nikad...).

Ako je ovo prljava upotreba refleksije, onda je ovo čista perverzija. ;)

f
[ StMilan @ 12.03.2005. 02:27 ] @
Ako sam dobro shvatio šta želiš da postigneš, mislim da to nije moguće u Javi.
Sa super možeš da pozoveš samo jedan nivo redefinisanih metoda.

Ali ako imaš nešto tipa
Code:

public class A {
    public method() {
        ....
    }
}

public class B extends A {
}

public class C extends B {

     public method() {
          super.method(); // <=== ovde ce biti izvrsena metoda definisana u A
           
     }

}


Citat:
filmil: java.lang.Object ima metod String toString(), koga mogu da koriste sve klase bez obzira koje su „koleno“ u nasleđivanju i bez obzira kojem paketu

Mislim da nije to bilo pitanje. Da li neka klasa moze da pozove implementaciju toString() iz Object klase. Ne, ako je neka nadklasa vec redefinisala toString().