[java] probleem met superklasse

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste tweakers, ik zet men een probleem in java.

Wij programmeren in java dmv bluej (object georienteerd programmeren).
De situatie is als volgt.

Ik heb een Superklasse Person met 2 subklassen Engineer en Admin. In een klasse Gui maak ik een instantie van zowel de klasse Engineer als de klasse Admin. In person heb ik een methode:
Java:
1
2
3
4
public ArrayList<Assignment> getOpenArray()
    {
        return interim.getOpenAssignments();
    }


interim is een instantie van de klasse Interim die een ArrayList<Assignment> heeft genaamd openAssignments. getOpenAssignments() returned deze lijst.

welnu:
doormiddel van specifieke commando's in de klasse Admin (niet in Person), voeg ik Assignment objecten toe aan openAssignments (via getOpenArray()). Als ik dan vervolgens in Gui admin.getOpenArray() uitvoer krijg ik mooi de lijst met de toegevoegde Assignments. Echter als ik de methode engineer.getOpenArray() uitvoer krijg ik een lege lijst. Dit terwijl getOpenArray() in de superklasse is gedefinieerd dus imho toch verwijst naar 1 en dezelfde lijst van interim.

Is er een manier om ervoor te zorgen dat zowel engineer.getOpenArray() en admin.getOpenArray() hetzelfde returnen?

bij voorbaat dank :)

grtz

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:00

Creepy

Tactical Espionage Splatterer

engineer en admin zijn beide losse classes. Van die classes maak je weer losse instanties. Ze hebben dus allebij hun eigen data. Een superclass zorgt er niet automatisch voor dat alle subclasses bij elkaars data kunnen. Zaken die je in admin aanmaakt of definieerd zijn niet automatisch beschikbaar in andere instanties van subclasses van Person. Sterker nog: zaken die je in de ene admin aanmaakt zijn niet zomaar beschikbaar in een andere admin. Ik heb het idee dat het verschil tussen een class en een instantie van een class je nog niet helemaal duidelijk is.

Waar sla je de assignments nu op? Als je dat op een andere plek doet dan in zou je ervoor kunnen zorgen dat verschillende andere classs bij die data kunnen.

[ Voor 37% gewijzigd door Creepy op 29-04-2009 15:45 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
het verschil tussen een class en een instantie is me wel duidelijk (ten minste daar ben ik van overtuigd). Ik moet wel een instantie van deze klassen (engineer en admin) maken want anders krijg ik last van "static errors" (non-static method cannot be referenced from a static context oid). De assignments staan nu opgeslagen in interim, een instantie van de klasse Interim. interim wordt aangemaakt in Person.

Ik zie niet in hoe ik dit moet veranderen zonder dat ik van het idee van superklassen afstap, maar dat lijkt me niet de bedoeling, de opdracht geeft toch een duidelijke hint richting het gebruik van superklassen op deze plaats.

Acties:
  • 0 Henk 'm!

  • vinnux
  • Registratie: Maart 2001
  • Niet online
Indien "interim" een static variable is zou het moeten werken wat je wilt.
Dit terwijl getOpenArray() in de superklasse is gedefinieerd dus imho toch verwijst naar 1 en dezelfde lijst van interim.
Bovenstaande quote is alleen van toepassing indien "intermin" static en daarmee global gedeclareerd is.

Echter lijkt het me niet logisch dat opdrachten voor engineer en admin hetzelfde zijn.

[ Voor 43% gewijzigd door vinnux op 29-04-2009 16:04 ]


Acties:
  • 0 Henk 'm!

  • Barres B.
  • Registratie: Oktober 2007
  • Laatst online: 19-09 15:59

Barres B.

six seasons and a movie!!!

Waar maak jij precies de instantie interim aan? Als je die nu in de GUI zou aan maken dan zou denk ik de data die in die instantie wordt opgeslagen door meerdere instanties(admin& Engineer) bereikbaar zijn. Ik ga hier er vanuit dat de array opgeslagen is in Interim. Ik zal de array in een aparte instantie neerzetten en daar de instanties (admin & engineer) de array laten oproepen.

Maar de instanties admin en engineer staan los van elkaar zoals Creepy als zei. Een superclass is gemaakt om dezelfde code maar één keer te gebruiken in het programma. Die code in de superclass wordt geerfd door de subclassen.
Je kunt ook meerdere instanties maken van één subklasse, maar daardoor krijgen de variabelen en dergelijke niet dezelfde waardes(tenzij je expliciet meegeeft). Je zou dus best 2 keer een admin maken en die hebben dan allemaal andere waarden in de variabelen.

...een dag uit je bed gekomen is een dag niet geleefd... barres.nl | Flickr


Acties:
  • 0 Henk 'm!

Verwijderd

Je ziet het inderdaad verkeert. Op het moment dat je een nieuwe instantie maakt dan krijg je ook nieuwe instanties van je instantie variabelen. De lijst is dus niet het zelfde. Dat ze erven van de klasse Person wil alleen maar zeggen dat ze beide een gemeenschappelijk kenmerk hebben. De instantie variabelen worden niet gedeeld.

Je zou de lijst als parameter mee kunnen geven aan een Person.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
vgouw schreef op woensdag 29 april 2009 @ 16:01:
Indien "interim" een static variable is zou het moeten werken wat je wilt.

Echter lijkt het me niet logisch dat opdrachten voor engineer en admin hetzelfde zijn.
ik ga het eens proberen.

Voor jou lijkt het niet logisch nee :) maar ze hebben wel degelijk een aantal dezelfde opdrachten. Zo moeten ingenieurs en beheerders (admin) allebei lijsten met gesloten opdrachten (assignments) en open opdrachten kunnen bekijken.

Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Edit: je antwoord maakt wat meer duidelijk.

Het lijkt in dit geval niet meer te gaan om een eigenschap van een Person, maar om een lijst van openstaande taken die binnen het Bedrijf (hoofdletter is een stille hint ;)) beschikbaar is.

Als zowel Engineers als Admins bij die lijst moeten kunnen, los je dat NIET op door dit in een superclass te stoppen, maar moet je op zoek naar een andere "eigenaar" van die lijst.

[ Voor 83% gewijzigd door Herko_ter_Horst op 29-04-2009 16:12 ]

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 29 april 2009 @ 16:01:
Je ziet het inderdaad verkeert. Op het moment dat je een nieuwe instantie maakt dan krijg je ook nieuwe instanties van je instantie variabelen. De lijst is dus niet het zelfde. Dat ze erven van de klasse Person wil alleen maar zeggen dat ze beide een gemeenschappelijk kenmerk hebben. De instantie variabelen worden niet gedeeld.

Je zou de lijst als parameter mee kunnen geven aan een Person.
ik begrijp het wel hoor, had wel blijkbaar niet ver genoeg nagedacht

iig de versie met Static interim werkt prima !! bedankt
Herko_ter_Horst schreef op woensdag 29 april 2009 @ 16:09:
De manier waarop het nu werkt lijkt me logischer dan de manier waarop jij wilt dat het werkt. Waarom wil je dat het zo werkt?

Een class definieert een blauwdruk voor objecten (instanties) die dezelfde eigenschappen hebben. Elke instantie heeft wel zijn eigen invulling van die eigenschappen.

Je hebt in je applicatie bijvoorbeeld een instantie van Admin (bijv. Admin jan = new Admin("Jan");) en een instantie van Engineer (bijv Engineer piet = new Engineer("Piet");). Als je nu aanroept "jan.getOpenArray().add(new Task("doe dit"));" zie ik niet in waarom die task ook in "piet.getOpenArray();" zou moeten zitten.

De vraag is dus: wil je dat gedrag wel echt?
mmmzzz, ik denk het wel. Er is immers maar 1 admin. Dus daar hoef ik me geen zorgen over te maken. Er zijn meerdere ingenieurs maar om in te loggen moet deze ingenieur zijn id geven zodat ik alsnog met 1 ingenieur werk. Is nogal moeilijk om uit te leggen en ik ben er mij van bewust dat het veel eleganter kan, maar dat zijn zorgen voor wat later. Het is niet dat ik daar geen rekening mee houd, in het begin was het alles behalve elegant, maar ik wil eerst dat het wat werkt en dan kijk ik of er verbeteringen mogelijk zijn.
Herko_ter_Horst schreef op woensdag 29 april 2009 @ 16:09:
Edit: je antwoord maakt wat meer duidelijk.

Het lijkt in dit geval niet meer te gaan om een eigenschap van een Person, maar om een lijst van openstaande taken die binnen het Bedrijf (hoofdletter is een stille hint ;)) beschikbaar is.

Als zowel Engineers als Admins bij die lijst moeten kunnen, los je dat NIET op door dit in een superclass te stoppen, maar moet je op zoek naar een andere "eigenaar" van die lijst.
dat van de hoofdletter weet ik wel :) (alle klassen moeten volgens conventie enkelvoud zijn en een hoofdletter hebben niet?).

wat de 2e zin betreft idd, ik zal eens kijken of ik het toch niet anders kan doen zoals jij zegt

[ Voor 255% gewijzigd door Verwijderd op 29-04-2009 16:17 ]


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:00

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op woensdag 29 april 2009 @ 16:09:
[...]


ik begrijp het wel hoor, had wel blijkbaar niet ver genoeg nagedacht

iig de versie met Static interim werkt prima !! bedankt
Snap je nu ook waarom het nu wel werkt? Want ander heb je toch nog niet helemaal helder hoe het nu zit met classes en instanties :)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Creepy schreef op woensdag 29 april 2009 @ 16:18:
[...]

Snap je nu ook waarom het nu wel werkt? Want ander heb je toch nog niet helemaal helder hoe het nu zit met classes en instanties :)
jaja, imho. aangezien je hem statisch maakt heb je geen variabel interim object, maar is het interim object steeds hetzelfde dus krijg je hetzelfde resultaat of je er nu een engineer of een admin een methode op laat uitvoeren.
kan zijn dat het niet helemaal juist is, moet dat hoofdstuk nog eens doorlezen

bedank iig

Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
"static" wil zeggen dat iets een eigenschap is van de class, in plaats van van elk van de afzonderlijke instanties. Het gevolg hiervan is, dat elke instantie van de class over d(i)ezelfde gegevens kan beschikken.

Je moet uitkijken dat je dit niet omdraait, dus NIET omdat je wilt dat elke instantie van een class over bepaalde gegevens kan beschikken, die gegevens als static in de class stoppen.

Zoals ik in mijn eerdere reply probeerde duidelijk te maken: de lijst van openstaande taken is geen eigenschap van één specifiek persoon, en (mijns inziens) ook niet van de class Persoon. Ik zou het een eigenschap maken van aparte class Bedrijf (of nog specifieker OpdrachtenBeheerder of zoiets).

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb een klasse bedrijf dus ik zal er eens naar kijken.

[ Voor 32% gewijzigd door Verwijderd op 29-04-2009 16:49 ]


Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Nog even teruggelezen en ik bedacht nog het volgende: ik weet niet precies hoe je probleemdomein in elkaar zit, maar het zou kunnen zijn dat jouw Admin de door mij genoemde OpdrachtBeheerder is, mede omdat je zegt dat er maar één instantie van Admin is. In dat geval beheert die ene Admin de lijst van openstaande opdrachten en kunnen Engineers aan die Admin instantie om de lijst met open opdrachten vragen.

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Je kan je trouwens afvragen of Admin en Engineer wel subklassen moeten zijn van Persoon, en niet taken/rollen die aan een persoon toegewezen kunnen worden.

Acties:
  • 0 Henk 'm!

Verwijderd

Een andere oplossing zou zijn om een Global class te maken waarin je dit soort data bijhoudt, als je deze class opzet door middel van het singleton patroon dan kun je in alle child classes gebruik maken van dezelfde instantie van het object. Hiermee omzeil je het gebruik van static variabelen
Pagina: 1