Parent class in child constructor als argument overwrite
Misschien een wat vreemde vraag want m'n PHP is een beetje roestig.
Ik zit een point en location class te maken en dit wil ik zeer efficiënt doen omdat deze class vaak en veel gaat worden gebruikt.
De "z" coordinaat heb je niet altijd nodig, dus de volgende opsplitsing.
Code (php)
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
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
<?php
class Point{
protected $x = 0,
$y = 0;
public function GetX(){
return $this->$x;
}
public function GetY(){
return $this->$y;
}
public function __construct( $x, $y ){
$this->$x = $x;
$this->$y = $y;
}
}
class Location extends Point{
protected $z = 0;
public function GetZ(){
return $this->$z;
}
public function __construct( "<....>" ){
$this->$z = $z;
}
}
?>
class Point{
protected $x = 0,
$y = 0;
public function GetX(){
return $this->$x;
}
public function GetY(){
return $this->$y;
}
public function __construct( $x, $y ){
$this->$x = $x;
$this->$y = $y;
}
}
class Location extends Point{
protected $z = 0;
public function GetZ(){
return $this->$z;
}
public function __construct( "<....>" ){
$this->$z = $z;
}
}
?>
Wat is zou willen bereiken is om je location zo te schrijven
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$x = 1;
$y = 2;
$z = 3;
$p = new Point( $x, $y );
$b = new Location( $x, $y, $z ); // standaard
$c = new Location( $p, $z ); // optioneel
?>
$x = 1;
$y = 2;
$z = 3;
$p = new Point( $x, $y );
$b = new Location( $x, $y, $z ); // standaard
$c = new Location( $p, $z ); // optioneel
?>
Ik zou dus willen kijken of het object (argument 1 van de Location constructor) gemaakt is door de Point, en als mogelijk de originele waarde van "$p" vervangen door de Location object met toegang tot de "$z".
Nu ben ik dus aan het zoeken geweest, en dan krijg je dus te maken met refference "&" op de variable waar ik nog niet zoveel kaas van heb gegeten (in ieder geval niet in PHP, ben C++ gewend en daar heeft het toch echt een andere functie :o)
Kan iemand mij de duw in de goede richting geven?
Alvast bedankt,
edit: zie dat je nog wat anders bedoelt, Je wil een object meegeven in je Location object en die waardes gebruiken voor je nieuwe Location object. Klopt dit? Je kunt niet constructors overloaden helaas, maar gelukkig kun je wel default waardes aangeven in de constructor, dus niet-verplichte waardes. Dat kun je eventueel oplossen door in de constructor te kijken naar het eerste argument, als dit een Point object is, kun je de X en Y gewoon overnemen uit dat object en de 2e variabele als Z gebruiken. Dat betekent echter wel dat de Z variabele ( je 3e parameter ) op je Location object dus een default heeft, hetgeen ervoor zorgt dat de logica in je Point object gelijk is aan de logica in je Location object. Zie 2e code:
De header van de constructor handelt alle argumenten af in die klasse. Als je in Location dus X, Y en Z coordinaten wil gebruiken kun je de constructor dus gewoon zo maken:
Om vervolgens je parent aan te spreken kun je net als in C++ gewoon parent gebruiken.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Gewijzigd op 18/01/2012 02:55:52 door Pieter Jansen
De code ($x instanceof Point) is waar ik op zoek naar was, maar als ik deze code zo zie omdat overloaden niet werkt dan ga ik er eventjes een nachie over slapen ;)
Bedankt voor het antwoord
Volgens mij is het of veel beter om gewoon altijd type Location te gebruiken waarbij je het met (x,y) kan aanmaken, of met (x,y,z). Of je kan een Location object aanmaken met de X en Y waardes van de al bestaande Point (dus $c = new Location( $p->getX(), $p->getY(), $z ); ) waarna je het Point object vernietigd, want die heb je niet meer nodig.
Als je bezorgd bent over het vele gebruik ervan, dan zou ik in elk geval niet dubbele objecten in het geheugen houden.
Ik kom ook vanuit een c (ook zonder ++) achtergrond.
Wat overerving in c++ betreft, moet je zien dat je een een extended class altijd een nieuwe constructor zet.
Een constructor is een plek waar je waarden een initiële waarde kan geven, waar je dingen kan activeren, ...
Van daaruit begrijp ik dat je in een extended class de constructor van de parent ook wil uitvoeren, in je nieuwe constructor.
In php is het allemaal minder strikt. Je kan bv. properties al een waarde geven buiten elke methode
class Point{
protected $x = 0; // dit moet je in c niet proberen
Maar ik vind de algemene redenering toch ook wat vreemd.
Binnenin Location is je $this een location object. Je moet binnenin Location niet denken in termen van "ik heb nog een soort sub-objectje van de class Point nodig".
Ik ben een spelletje aan het maken die in de ruimte afspeelt, hiermee werk ik met sterrenkaarten dus kortom rectangles, waarbij de sx,sy en ex,ey ook weer te maken heeft met Points.
Het idee hierachter, is dat ik codes uit kan voeren zoals het selecteren van planeten in rectangle of in range van point en of loc.
Kortom, idee klonk theoretisch goed maar in de praktijk moeilijker te implementeren.
Nogmaals bedankt heren.
Aha, maar heeft niet elk onderdeel dan XYZ coordinaten nodig? Een vector alleen is niet genoeg tenzij je enkel flat maps gebruikt. Anders kun je altijd nog een matrix gebruiken om je calculaties op los te laten, dan hoef je geen location objects te gebruiken maar gewoon array`s.