Bondt met dt
[mod] 007 ½
Sinds 2/5/2003
T: 19
R: 715
|
23/3/2008 -
17:29u
| Quote
|
Ik zit met een vreemd probleem wat betreft klassen en objecten... Het zit zo:
Ik heb 3 klassen, laten we zeggen klasse a, b, c. Klasse a maakt een object van klasse b Klasse c wilt de methodes in klasse b aanroepen door het object van a te gebruiken.
Code:
Klasse A ----------
klasseB objectje = new klasseB(); // object maken van klasse B int result = objectje.telOp(2,3); // een methode in klasse B gebruiken
Klasse B ----------
int optelling; public void telOp(int getal1, int getal2) { optelling = getal1 + getal2; }
public int geefAntwoord() { return optelling; }
Klasse C ----------
// hier in klasseC wil ik dus de methode geefAntwoord uit klasseB gebruiken voor objectje uit klasseA protected klasseA a; int resultaat = a.objectje.geefAntwoord();
Resultaat: niets! Hoe kan dit? De compiler klaagt ni en ik dacht toch dat dit de juiste manier van werken was?
|
dannyboy
wzl-lid
Sinds 31/5/2005
T:108 -
R:883
|
23/3/2008 -
19:37u
| Quote
|
dat komt doordat je in klassec wel een instantie van klassea declareert, maar die code die erin staat wordt dan nog nniet uitgevoerd. ook is die 2de regel code van klassea niet echt proper. ik zal eveen proberen een oplossing te maken.
|
dannyboy
wzl-lid
Sinds 31/5/2005
T:108 -
R:883
|
23/3/2008 -
19:42u
| Quote
|
Code:
Klasse A ----------
public class KlasseA {
KlasseB objectje;
public KlasseA() { objectje = new KlasseB(); // object maken van klasse B objectje.telOp(2,3); // een methode in klasse B gebruiken } }
Klasse B ---------- public class KlasseB {
int optelling;
public void telOp(int getal1, int getal2) { optelling = getal1 + getal2; }
public int geefAntwoord() { return optelling; } }
Klasse C ----------
public class KlasseC {
public static void main(String[] args) { KlasseA a = new KlasseA(); int resultaat = a.objectje.geefAntwoord(); } }
Dit zou moeten werken
edit: ik heb de belangerijke code int vet gezet. Als je het vetgedrukte in KlasseC uitvoert zal de vetgedrukte method in KlasseA worden uitgevoerd. Die methode is een speciale method die de constructor noemt en wordt uitgevoerd als '= new ...()' uitvoert.
Laatst aangepast door
dannyboy
op 23/03/2008 19:47:45u
(3x aangepast)
|
dannyboy
wzl-lid
Sinds 31/5/2005
T:108 -
R:883
|
23/3/2008 -
19:49u
| Quote
|
zoals je ziet doen we ergens ook 'new KlasseB()' en toch is er in KlasseB niet zo'n constructor als in KlasseA. In dat geval gebruikt java de default constructor en dat is te vergelijken als een method met geen parameters en geen code in.
|
naftebak
WZL-lid
Sinds 8/6/2003
T:9 -
R:1047
|
23/3/2008 -
22:25u
| Quote
|
Bondt ge hebt blijkbaar nog altijd geen cursus objectgericht programmeren gevolgd?
|
dannyboy
wzl-lid
Sinds 31/5/2005
T:108 -
R:883
|
23/3/2008 -
23:15u
| Quote
|
dat zou idd veel helpen...
|
Zubzub
wzl-lid
Sinds 30/7/2005
T:2 -
R:176
|
24/3/2008 -
0:37u
| Quote
|
yup, geen resultaat omdat ge de telop methode nog niet hebt aangeroepe. dannyboy lost het op door het in de constructor van a te zette. Je kan ook gewoon de telopmethode appart aanroepe en dan de geefresultaat. maar geefresultaat zonder de optelmethode eerst uit te voeren zal, vrij logisch, geen resultaat opleveren 
dus in c kan je doen a.objectje.telop(2,3); int resultaat = a.objectje.geefresultaat();
Protected en direct variable access (=a.objectje) worden trouwens aangenomen als bad programmer practice Gebruik settters en getters voor het geven en setten van variabelen en probeer protected te vermijden (hoewel het niet verboden is natuurlijk).
En ja volg es een deftige cursus OO programmeren
Laatst aangepast door
Zubzub
op 24/03/2008 0:40:29u
(1x aangepast)
|
Bondt met dt
[mod] 007 ½
Sinds 2/5/2003
T:19 -
R:715
|
24/3/2008 -
3:31u
| Quote
|
Even een kleine vermelding: het voorbeeld van hierboven is een uit de duim gezogen stuk code, dus wat betreft de werking en aanroepvolgorde van methodes hoeft er geen aandacht aan besteed te worden Ik werk met getters en setters en de kwestie 'protected' al dan niet gebruiken, daar heb ik al verschillende meningen over gehoord. De een vindt het wel nodig, de ander niet. Ik heb toevallig gekozen om het wel te doen 
Hetgeen ik dus in concreto vergeten ben is het toevoegen van KlasseA a = new KlasseA(); in de klasseC 
Muchas gracias
|