Toon posts:

[OO] Owner aanspreken

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een javascript wat ik een beetje object georienteerd probeer uit te werken.

Het aanmaken van eigen objecten is geen enkel punt. Nu heb ik echter een object "rowCollection". Deze bevat onder andere een aantal eigen variabelen. Maar ook een array genaamd "rows". In deze array zitten allemaal objecten van het type "Row". Nu kan ik van een rowcollection eenvoudig alle rows langslopen en per row een actie uitvoeren. Maar is het ook mogelijk om vanuit een row, een property van de overkoepelende rowcollection te raadplegen?

[ Voor 12% gewijzigd door Verwijderd op 03-02-2006 11:19 ]


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-04 15:11

Bosmonster

*zucht*

Ja, als je een reference toevoegt aan je Row object naar de rowCollection (cross referencing). Vraag is of je dat wilt, want wat als je nu meerdere rowCollections hebt en dezelfde rows meerdere keren voorkomen? Het idee van de collection is juist dat je ze vandaaruit kunt aanspreken.

Vraag is dus ook een beetje, waarom. Wat voor property/method wil je aanspreken van de rowCollection dat dit zou rechtvaardigen en is het niet op een andere manier op te lossen?

  • ZroBioNe
  • Registratie: Augustus 2001
  • Niet online
Als die class overerft, kan je gewoon de parent aanspreken ,want die methodes heeft ie zelf ook

PHP:
1
$this->obj();


Visual Basic .NET:
1
Me.Obj()


Zoiets als dit?

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 04-01 15:49

JHS

Splitting the thaum.

ZroBione: Hij wil niet de methods, maar de properties aanspreken...

DM!


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-04 15:11

Bosmonster

*zucht*

Bovendien gaat het niet om overerving, maar om een collection.

  • Valor
  • Registratie: Mei 2005
  • Laatst online: 06-02 08:25

Valor

yummie spam

JHS schreef op vrijdag 03 februari 2006 @ 13:43:
ZroBione: Hij wil niet de methods, maar de properties aanspreken...
Uhm wat dacht je van getters en setters. Je gaat variablen van een object toch niet public declaren.

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-04 15:11

Bosmonster

*zucht*

Valor schreef op vrijdag 03 februari 2006 @ 14:07:
[...]


Uhm wat dacht je van getters en setters. Je gaat variablen van een object toch niet public declaren.
En het gaat om javascript. (stond ooit in de title, maar heeft een wijze mod weggehaald)

[ Voor 12% gewijzigd door Bosmonster op 03-02-2006 14:14 ]


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 20:57

mulder

ik spuug op het trottoir

Valor schreef op vrijdag 03 februari 2006 @ 14:07:
[...]


Uhm wat dacht je van getters en setters. Je gaat variablen van een object toch niet public declaren.
Soms wel, soms niet? Dan heten het Fields (in C#)

oogjes open, snaveltjes dicht


  • M-ThijZ
  • Registratie: Maart 2003
  • Laatst online: 17:18

M-ThijZ

Riding on Rails

Als je het parent Object aan wilt spreken gebruik je toch gewoon 'super', of zit ik compleet ergens anders?

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 11-04 21:36
Je zou een verwijzing kunnen setten, dat is niet mooi maar werkt wel:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
function row() {
  var parent)=false;
  function setParent(p) {
    this.parentO=p;
  }
}

function group() {
  var rows=new Array();
  rows[0]=new Row();
  rows[0]->setParent(this);
}

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 04-01 15:49

JHS

Splitting the thaum.

Valor schreef op vrijdag 03 februari 2006 @ 14:07:
[...]Uhm wat dacht je van getters en setters. Je gaat variablen van een object toch niet public declaren.
Daar heb je niks aan.

Pseudocode
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class A {
  private var $a = null;

  function set_a($var) {
    $this->a = $var
  }

  function get_a() {
    return $a
  }
}

class B extends A {
}

$oA = new A
$oB = new B
$oA->set_a("foo")
$a = $oB->get_a() //=> returns null / error


Er wordt null / een error gereturned aangezien het object oA een state heeft met $a = "foo", en niet oB . De state van een child object heeft niets van doen met de state van de parent. (Behalve in sommige gevallen zaken uit de de constuctor.)

[ Voor 4% gewijzigd door JHS op 03-02-2006 14:55 ]

DM!


Verwijderd

Topicstarter
djluc schreef op vrijdag 03 februari 2006 @ 14:39:
Je zou een verwijzing kunnen setten, dat is niet mooi maar werkt wel:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
function row() {
  var parent)=false;
  function setParent(p) {
    this.parentO=p;
  }
}

function group() {
  var rows=new Array();
  rows[0]=new Row();
  rows[0]->setParent(this);
}
Dat is inderdaad het enige wat ik me kon bedenken.

Overerving gaat niet op, omdat een rowcollection en een row twee totaal verschillende objecten zijn.

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:05
M-ThijZ schreef op vrijdag 03 februari 2006 @ 14:38:
Als je het parent Object aan wilt spreken gebruik je toch gewoon 'super', of zit ik compleet ergens anders?
Je zit compleet ergens anders.
Jij zit bij inheritance.

De topicstarter heeft het over de 'owner' eigenlijk. (Bv, een Order heeft OrderLines, maar een OrderLine behoort tot een Order: De topicstarter heeft het dus over die Order van die OrderLine).

https://fgheysels.github.io/


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-04 15:11

Bosmonster

*zucht*

Verwijderd schreef op vrijdag 03 februari 2006 @ 15:02:
[...]


Dat is inderdaad het enige wat ik me kon bedenken.

Overerving gaat niet op, omdat een rowcollection en een row twee totaal verschillende objecten zijn.
Maar zoals ik in mn eerste reactie al zei, wil je dit wel? Het geeft problemen als je items in meerdere collecties voorkomen bijvoorbeeld.

Waarom moet een member iets weten van de collection?

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
JHS schreef op vrijdag 03 februari 2006 @ 14:54:
[...]
Daar heb je niks aan.

Pseudocode
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class A {
  private var $a = null;

  function set_a($var) {
    $this->a = $var
  }

  function get_a() {
    return $a
  }
}

class B extends A {
}

$oA = new A
$oB = new B
$oA->set_a("foo")
$a = $oB->get_a() //=> returns null / error


Er wordt null / een error gereturned aangezien het object oA een state heeft met $a = "foo", en niet oB . De state van een child object heeft niets van doen met de state van de parent. (Behalve in sommige gevallen zaken uit de de constuctor.)
Ik krijg het idee dat je niet helemaal begrijpt hoe OO werkt. Natuurlijk heeft $oB niet de waarde die je aan $oA toekent. Het zijn immers 2 verschillende instanties. Dat $oA een A object is en $oB een B object (en daardoor ook een A) heeft daar helemaal niets mee te maken. Ook al zou $oB wel een puur A type object zijn, dan nog zou $oB niet de waarde "foo" krijgen, het zijn nog steeds 2 verschillende instanties. Dat staat allemaal los van het feit dat $a private is en dat hij via getters en setters wordt aangesproken.

Wat Valor bedoelde was dat variabelen niet public gedeclareerd moeten worden, maar dat je ze via setters en getters hoort aan te spreken (eigenlijk precies wat hij zij). Daar heb je zeker wel wat aan, omdat je dan ecapsulate hoe het werkelijk geimplementeerd is. Ook in JS is dat een goede practice.

Noushka's Magnificent Dream | Unity


  • Valor
  • Registratie: Mei 2005
  • Laatst online: 06-02 08:25

Valor

yummie spam

Bosmonster schreef op vrijdag 03 februari 2006 @ 14:14:
[...]


En het gaat om javascript. (stond ooit in de title, maar heeft een wijze mod weggehaald)
Oh lol. Ja je zou kunnnen denken dat je een reference mee geeft aan elke row van de rowCollection. Al hoewel dat wel heel ranzig is en absoluut niet OO maar goed dat zou wel werken!

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 04-01 15:49

JHS

Splitting the thaum.

Michali: Ja, dat was mijn boodschap, losstaand van de rest van het verhaal waar ik geen zin in had, of niet soms?

DM!


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Je hebt gelijk ja, maar dan nog snap ik niet waarom je dat als reactie geeft op wat Valor zei. Het heeft namelijk niets te maken met wat hij probeerde te zeggen. (Of mis ik hier iets?)

Noushka's Magnificent Dream | Unity


  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 04-01 15:49

JHS

Splitting the thaum.

Michali: Ik maakte het punt dat wat ZroBione zei niet kon. ZroBione beweerde dat je de properties / state van de parent class kon bereiken, maar hij bedoelde eigenlijk de methods van de parent. Mijn reactie was dus dat hij niet de methods maar de properties wilde aanspreken, wat niet op die manier kan. Valor reageerde daarop dat je getters / setters moet gebruiken.

Ik nam aan dat Valor bedoelde dat je met behulp van het aanroepen van de getter / setter methods geerfd van de parent de properties / state van de parent kon bereiken. Waarop ik reageerde met het betreffende voorbeeld waarmee ik probeerde duidelijk te maken dat dat niet kan.

DM!


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Ah ok, maar dat wordt niet echt duidelijk uit je voorbeeld :) Ik denk dat je dan eerder dit bedoelt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A
{
  private $a;
  public function getA() { return $this->a; }
  public function setA($a) { $this->a = $a; }
}

class B extends A
{
  public function printA() { print $this->a; }
}

$obj = new B();
$obj->setA("blaat");
$obj->printA(); // dit print helemaal niets

Noushka's Magnificent Dream | Unity


  • Bint
  • Registratie: Juli 2002
  • Laatst online: 12-04 09:33
maak em dan protected ;)

Memories of yesterday, will grow, but never die


Verwijderd

Topicstarter
Iemand ondertussen al enig idee. Hetzelfde probleem kan ik me namelijk ook voorstellen bij een ontwerp met "Bedrijven" en "Medewerkers". Zijn naar mijn idee toch best veel voorkomende situaties. Stel dat je van een medewerker de bedrijfsnaam wilt weten bijvoorbeeld.

Verwijderd

Verwijderd schreef op dinsdag 07 februari 2006 @ 16:13:
Iemand ondertussen al enig idee. Hetzelfde probleem kan ik me namelijk ook voorstellen bij een ontwerp met "Bedrijven" en "Medewerkers". Zijn naar mijn idee toch best veel voorkomende situaties. Stel dat je van een medewerker de bedrijfsnaam wilt weten bijvoorbeeld.
Dan moet je dus ergens in de Medewerker klasse een verwijzing naar een instantie van Bedrijf hebben. Ofwel door een bedrijf als parameter mee te geven aan de constructor, ofwel door die met een methode aan de instantie te geven. Zoals Michali hierboven bijvoorbeeld doet.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 12-04 09:44
Of een 'query' doen aan het 'BedrijvenManager' object of 'ie alle bedrijven die 'this' als medewerker hebben wil opzoeken.

Objecten die naar elkaar wijzen zijn vaak niet zo'n goed idee.

[ Voor 34% gewijzigd door farlane op 07-02-2006 16:31 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 11-04 21:36
farlane schreef op dinsdag 07 februari 2006 @ 16:30:
Of een 'query' doen aan het 'BedrijvenManager' object of 'ie alle bedrijven die 'this' als medewerker hebben wil opzoeken.
Objecten die naar elkaar wijzen zijn vaak niet zo'n goed idee.
Je moet dan toch ook de juiste instantie van BedrijvenManager te pakken zien te krijgen? Dat is toch juist het probleem wat hier geschets wordt?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 12-04 09:44
djluc schreef op woensdag 08 februari 2006 @ 12:44:
[...]
Je moet dan toch ook de juiste instantie van BedrijvenManager te pakken zien te krijgen? Dat is toch juist het probleem wat hier geschets wordt?
Iha is zo'n object een singleton, wat het OO principe niet in gevaar hoeft te brengen. ( caveat God class )

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1

Let op:
Even voor de mensen die een topicreport aan willen maken: ja, javascript hoort in W&G, maar dit betreft meer een algemeen programmeerprobleem. Het heeft op zich dan ook weinig met javascript te maken :).