I am one hell of a guy, I can do anything I want, only I just don't have the faintest idea what.
Zaphod Beeblebrox, in The Hitch Hiker's Guide To The Galaxy
Nope, want ik heb echt die ene specifieke instantie van de Aardbei nodig. Het gaat dus echt om de referentie.Michali schreef op dinsdag 29 maart 2005 @ 13:42:
Je zou dan direct het geheugen moeten bewerken dermate van pointers (zoals in c++), maar dat is echter niet mogelijk in Java (als ik me niet vergis). Is het niet mogelijk om gewoon op de plaatsten waar je een aarbei nodig hebt hem even te upcasten? Anders zou ik het ook niet weten.
I am one hell of a guy, I can do anything I want, only I just don't have the faintest idea what.
Zaphod Beeblebrox, in The Hitch Hiker's Guide To The Galaxy
Gewoon ff een wrapper erom heen plaatsen. Iedereen wijst naar die wrapper.. en als je dan de interne verwijzing in die wrapper naar het echte object vervangt, heeft iedereen een nieuwe vrucht.
Het state-designpattern zou eventueel ook een oplossing kunnen zijn. het borduurd verder op de wrapper, maar van buitenaf is het voor iedereen een vrucht ipv een dom wrapper object.
[opmerkingen]
Ik weet niet waar jij dit voor nodig bent dus ik kan ook niet oordelen of dit een goeie oplossing is. Maar mijn vermoeden is dat je door ander oo ontwerp tot een betere oplossing kan komen. Instanties van objecten verwisselen alleen omdat je een ander type hebt gekregen kan duiden op een fout ontwerp.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| class StandaardVrucht { public void doeIets() { // doe iets } } class Aarbei extends StandaardVrucht { public void doeIets() { // doe iets anders } } class Vrucht { private StandaardVrucht vrucht; public Vrucht() { vrucht = new Aarbei(); } public void setVrucht(StandaardVrucht vrucht) { this.vrucht = vrucht; } public void doeIets() { vrucht->doeIets(); } } |
Je zit dan alleen wel met losse methods die niets uitvoeren als de vrucht in een bepaalde staat is.
Thnx voor het wrapper idee, dat is zeker mogelijk, doch vind ik persoonlijk een wat omslachtige manier. Aan de andere kant is het wel een nette Java manier waarschijnlijkAlarmnummer schreef op dinsdag 29 maart 2005 @ 13:46:
[antwoord op je vraag]
Gewoon ff een wrapper erom heen plaatsen. Iedereen wijst naar die wrapper.. en als je dan de interne verwijzing in die wrapper naar het echte object vervangt, heeft iedereen een nieuwe vrucht.
Het state-designpattern zou eventueel ook een oplossing kunnen zijn. het borduurd verder op de wrapper, maar van buitenaf is het voor iedereen een vrucht ipv een dom wrapper object.
[opmerkingen]
Ik weet niet waar jij dit voor nodig bent dus ik kan ook niet oordelen of dit een goeie oplossing is. Maar mijn vermoeden is dat je door ander oo ontwerp tot een betere oplossing kan komen. Instanties van objecten verwisselen alleen omdat je een ander type hebt gekregen kan duiden op een fout ontwerp.
Over je tweede punt: Ik heb het voor het gemak over vruchten en aardbeien, maar in werkelijkheid gaat het hier niet over
Ik weet uit mijn hoofd niet of daar een mooi OO-model voor bestaat helaas.
I am one hell of a guy, I can do anything I want, only I just don't have the faintest idea what.
Zaphod Beeblebrox, in The Hitch Hiker's Guide To The Galaxy
Edit: je zult dan echter wel moeten bijhouden wat voor object je nu opgeslagen hebt. Hiervoor mischien een aparte set functies toevoegen? Anders is een state/strategy oplossing toch het beste.
[ Voor 27% gewijzigd door Michali op 29-03-2005 14:03 ]
State design patternFuncracker schreef op dinsdag 29 maart 2005 @ 13:57:
[...]
Ik weet uit mijn hoofd niet of daar een mooi OO-model voor bestaat helaas.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| interface Vrucht{
void knijpErin();
void gooiErmee();
}
class VruchtWrapper implements Vrucht{
void setVrucht(Vrucht vrucht){
_vrucht = vrucht;
}
void knijpErin(){
_vrucht.knijpErin();
}
void gooiErmee(){
_vrucht.gooiErmee();
}
} |
Een vruchtwrapper kun je nu zien als een volwaardige vrucht:
Vrucht v = new VruchtWrapper(aardbei)//constructor moetje nog ff aanmaken
v.knijpErin();
Maar nogmaals.. deze oplossing is niet gratis. Je krijgt bv identiteits problematiek (equals/hashproblematiek in collections).. heeft bepaalde consequenties voor concurrency control.
[ Voor 67% gewijzigd door Alarmnummer op 29-03-2005 14:23 ]
Yupz, een wrapper zou ook zeker kunnen. Jouw voorstel ziet er ook goed uit.Michali schreef op dinsdag 29 maart 2005 @ 14:02:
Een wrapper gaat toch goed? Je kan eventueel een class maken met 2 functies en 1 veld: getObject() setObject en object. Zoals alarmnummer al zei kun je zo het object zetten en overal weer ophalen. Je kunt dan in een class het object ophalen en geupcast weer terug stoppen.
Edit: je zult dan echter wel moeten bijhouden wat voor object je nu opgeslagen hebt. Hiervoor mischien een aparte set functies toevoegen? Anders is een state/strategy oplossing toch het beste.
Maar om even terug te komen op mijn originele vraag: Het is dus niet mogelijk om het object daadwerkelijk in het geheugen te vervangen door een subclass? Of om alle referenties naar het object te laten verwijzen naar het nieuwe object?
Met wrappers ga ik er wel uitkomen, maar ik gebruik ze liever niet. Wil het graag simpel houden
I am one hell of a guy, I can do anything I want, only I just don't have the faintest idea what.
Zaphod Beeblebrox, in The Hitch Hiker's Guide To The Galaxy
Naar mijn weten niet.Funcracker schreef op dinsdag 29 maart 2005 @ 14:16:
Maar om even terug te komen op mijn originele vraag: Het is dus niet mogelijk om het object daadwerkelijk in het geheugen te vervangen door een subclass? Of om alle referenties naar het object te laten verwijzen naar het nieuwe object?
[edit]
Als je trouwens wel andere methode implementaties nodig bent zou je deze ook in VruchtType kunnen definieeren en de vrucht als invoer meegeven aan die methodes.
[ Voor 28% gewijzigd door Alarmnummer op 29-03-2005 14:35 ]
Yupz, dat is zeker een mooie (imhoAlarmnummer schreef op dinsdag 29 maart 2005 @ 14:25:
Kan een vrucht ook andere attributen krijgen als het in een ander type veranderd? Kan een object ook andere methode implementaties krijgen als het in een ander type verandert? Zo nee dan zou ik gewoon een VruchtType aanmaken en geen Vrucht subclasses. Iedere vrucht is van een bepaald vrucht type (je geeft iedere vrucht dus een attribuut vruchttype). Dit is een eenvoudige maar binnen de door mij genoemde voorwaarden tevens de beste oplossing.
[edit]
Als je trouwens wel andere methode implementaties nodig bent zou je deze ook in VruchtType kunnen definieeren en de vrucht als invoer meegeven aan die methodes.
I am one hell of a guy, I can do anything I want, only I just don't have the faintest idea what.
Zaphod Beeblebrox, in The Hitch Hiker's Guide To The Galaxy
Dit houd in dat je een klasse maakt met alleen maar lege methodes.
Zoiets als dit:
1
2
3
| public interface Vrucht{ public void blaat(){} } |
Dan kan je je aardbei deze late implementeren:
1
2
3
4
5
| public class Aardbei{ public void blaat(){ //doe iets } } |
Hierdoor kan je alle vruchten typecasten naar de Vrucht interface:
1
2
| Aardbei aardbei = new Aardbei; Vrucht vrucht = (Vrucht)aardbei; |
[ Voor 8% gewijzigd door The-MeLLeR op 29-03-2005 15:02 ]
Dat laatste kan wel, maar of het mooi wordt is iets anders.
Het kan op twee manieren:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
| import java.util.*; public class Vrucht { private static int id = 0; private String naam = this.getClass().getName() + id++; public String toString() { return naam; } // voor maakVanVruchtEenAardbei2 private Vector eigenaars = new Vector(); // voor 2 public void voegEigenaarToe(Eigenaar e) { eigenaars.add(e); } // 2 public void veranderInDezeAardbei(Aardbei a) { for (int i = 0; i < eigenaars.size(); i++) { ((Eigenaar)eigenaars.get(i)).vervangVruchtDoorDezeAardbei(a); } } } public class Aardbei extends Vrucht{ } import java.util.*; public class Eigenaar { private static int id = 0; private String naam = this.getClass().getName() + id++; public String toString() { return naam + " bezit " + v; } // 1 private static Vector eigenaars = new Vector(); private Vrucht v; public Eigenaar(Vrucht v) { this.v = v; // 2 v.voegEigenaarToe(this); // 1 eigenaars.add(this); } // 1 public void maakVanVruchtEenAardbei1() { Aardbei a = new Aardbei(); Vrucht v = this.v; for (int i = 0; i < eigenaars.size(); i++) { ((Eigenaar)eigenaars.get(i)).vervangDezeVruchtDoorDezeAardbei(v, a); } } // 2 public void maakVanVruchtEenAardbei2() { v.veranderInDezeAardbei(new Aardbei()); } // 2 public void vervangVruchtDoorDezeAardbei(Aardbei a) { v = a; } // 1 public void vervangDezeVruchtDoorDezeAardbei(Vrucht v, Aardbei a) { if (this.v == v) this.v = a; } } public class Start { public static void main(String[] args) { Vrucht v0 = new Vrucht(); Vrucht v1 = new Vrucht(); Eigenaar e0 = new Eigenaar(v0); Eigenaar e1 = new Eigenaar(v0); Eigenaar e2 = new Eigenaar(v1); Eigenaar e3 = new Eigenaar(v1); System.out.println(e0); System.out.println(e1); System.out.println(e2); System.out.println(e3); e0.maakVanVruchtEenAardbei1(); e2.maakVanVruchtEenAardbei2(); System.out.println(e0); System.out.println(e1); System.out.println(e2); System.out.println(e3); } } |
[ Voor 32% gewijzigd door Daos op 29-03-2005 16:46 ]
I am one hell of a guy, I can do anything I want, only I just don't have the faintest idea what.
Zaphod Beeblebrox, in The Hitch Hiker's Guide To The Galaxy
Volgens mij niet. De andere referenties refereren nog steeds naar een aardbei volgens mij.Hielko schreef op dinsdag 29 maart 2005 @ 16:32:
Volgens mij de suggestie van The-MeLLeR de suggestie die je zoekt.
Yup. Dat is niet de juiste oplossing. Ik kan niet al die references casten (helaas).Michali schreef op dinsdag 29 maart 2005 @ 16:34:
[...]
Volgens mij niet. De andere referenties refereren nog steeds naar een aardbei volgens mij.
I am one hell of a guy, I can do anything I want, only I just don't have the faintest idea what.
Zaphod Beeblebrox, in The Hitch Hiker's Guide To The Galaxy