Toon posts:

[OO/UML/.NET] Klasse in Klasse en hoe te modelleren?

Pagina: 1
Acties:

Verwijderd

Topicstarter
In vb.net kun je een klasse in een klasse zetten

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Public Class Klasse1

...

        Private Class Klasse2
        ...

        ...
        End Class

...

End Classs


Hoe modelleer je dit in UML?
En wanneer stop je in klasse in een klasse?

Verwijderd

Je stopt een klasse in een andere klasse wanneer de inner klasse veel verband heeft met de outer klasse. Bijvoorbeeld wanneer het bestaan van de inner klasse op zijn eigen geen nut heeft van bestaan, maar alleen bij de outer klasse hoort.

voorbeeld: kanon en loop. Het heeft geen zin om een apparte klasse voor loop aan te maken want loop op zichzelf heeft geen reden van bestaan.
Anderzijds zorgt de inner klasse er wel duidelijk voor de een kanon bestaat uit een loop.

Wanneer je toch een object van de inner klasse wilt aanmaken zonder dat je een instantie van je outer klasse wilt maken moet je het keyword "shared" gebruiken.

Voor zover ik weet heeft dit geen echte uml notatie, misschien kan je een kader binnen een kader proberen?

Verwijderd

Topicstarter
Ja wel noemen we aggregatie. (Ruit)

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Verwijderd schreef op 28 januari 2004 @ 16:55:
Ja wel noemen we aggregatie. (Ruit)
Dat is nog iets anders.
Een aggregatie is als een object A een (of meerdere) andere objecten van het type B (kan ook C of D zijn, zolang ze maar aan de interface van B voldoen)'heeft', maar die objecten (geen classes dus), kunnen wel op zichzelf bestaan. (In het voorbeeld van s-man2 kan die loop niet op zichzelf bestaan).
Een compositie is als een object A een object B bezit, en dat object B op zichzelf eigenlijk geen bestaansrecht heeft (zoals het voorbeeld van dat kanon en die loop).

Echter, imo gebruik je daar geen 'inner classes' voor, want dat is hetgeen waar jij het in je topicstart over hebt. Inner classes gebruik je imho enkel als je die 'inner class' enkel gaat gebruiken binnen de class waar je ze gedeclareert hebt.

Het voorbeeld van s-man2 zou je beter niet met inner classes gaan implementeren, maar mbhv composition.
In het voorbeeld van s-man2 zou je dus imo de volgende classes hebben:
een class Kanon (dat bv. de interface 'vuurwapen') implementeert, een een class 'Loop'.
De class Kanon bevat dan een object van het type loop. Op die manier kan je dan bv. ook makkelijk een class Geweer maken, die de 'vuurwapen' interface ook implementeert, en ook een object van het type loop bezit (zei het dan met andere eigenschappen).

https://fgheysels.github.io/


Verwijderd

@whaomi
We hebben op school een oefening moeten maken met een kanon in (daarmee dat ik met het voorbeeld kwam opzetten). Ik had het zelf als composition geimplementeerd. Nu kwam de leraar opzetten met "zijn" oplossing: hij had een inner class gebruikt voor die loop. Nu dacht ik dus dat zijn oplossing beter was omdat het in mijn geval geen nut heeft op loop te instantieëren. Kan jij verklaren waarom je in dit geval composition zou gebruiken?
Een reden zou kunnen zijn dat een tank ook een loop zou kunnen gebruiken bvb.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Verwijderd schreef op 28 januari 2004 @ 19:45:
@whaomi
We hebben op school een oefening moeten maken met een kanon in (daarmee dat ik met het voorbeeld kwam opzetten). Ik had het zelf als composition geimplementeerd. Nu kwam de leraar opzetten met "zijn" oplossing: hij had een inner class gebruikt voor die loop. Nu dacht ik dus dat zijn oplossing beter was omdat het in mijn geval geen nut heeft op loop te instantieëren. Kan jij verklaren waarom je in dit geval composition zou gebruiken?
Een reden zou kunnen zijn dat een tank ook een loop zou kunnen gebruiken bvb.
Ik heb het eigenlijk al een beetje uitgelegd in m'n eerdere post:
Als je die classe 'loop' als inner class in de class Kanon definieert, is 'Loop' vastgekoppeld aan kanon.
Als je het doet mbhv composition, kan je diezelfde class Loop gebruiken in een andere class die ook een Loop heeft (bv. een geweer, pistool, ....).

https://fgheysels.github.io/


Verwijderd

Volgens together ziet een inner class er in uml zo uit:

Afbeeldingslocatie: http://users.skynet.be/thesix/got/uml.png

Ik ben er niet zeker van dat dit volledig volgens de standaarden is.

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Een beter voorbeeld van een innerclass vind ik zelf een Threadpool en zijn WorkerThread. De workerthread moet gebruik maken van interne (private) methodes van de Threadpool (de callback, die wil je niet public hebben). Dat vind ik dan ook de enige reden om een innerclass te maken, anders kan een package local class ook best.

Qua modellatie is het voor de parentclass natuurlijk niets raars. Hij gebruikt gewoon een referentie naar die innerclass, wat geloof ik een compositie zal worden in UML (het is lang geleden ;) )
De modelatie van de innerclass zou ik gewoon als aparte class pakken en er een namespace aanhangen in de trand van [namespace parentclass]::Parentclass

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21-05 20:13
Wat ik persoonlijk goed voorbeeld van gebruik van innerclass vind is Knoop in Lijst. Hoewel Matty (Huntjens) hier ontzettend veel bezwaren tegen zal hebben ;)

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik vraag me altijd af hoe nuttig UML op dit lage nivo is. Ik pas alleen UML toe op hoog nivo als communicatie middel (eventueel naar mezelf). Maar op laag nivo (dus innerclass zaken) vraag ik me af hoe nuttig UML daar is.

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21-05 20:13
Inderdaad! Ik zat al na te denken op wat voor manier je dat moest uitdrukken in UML, maar innerclasses zijn toch meestal dingen die niet zichtbaar zijn voor de buitenwereld. Waarom zou je ze dus opnemen in UML?! :)

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Alarmnummer schreef op 29 januari 2004 @ 14:29:
Ik vraag me altijd af hoe nuttig UML op dit lage nivo is. (...)
Skeleton generatie: hoewel, ik me afvraag in hoeverre je innerclasses wilt hebben in gegenereerde code.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Glimi schreef op 29 januari 2004 @ 20:09:
[...]
Skeleton generatie: hoewel, ik me afvraag in hoeverre je innerclasses wilt hebben in gegenereerde code.
brrr.. ik heb een aantal UML tools geprobeerd maar ik vond ze meer in de weg zitten dan iets toevoegen. UML is leuk als communicatie naar anderen, en om in grote lijnen opzetten van een systeem. Maar UML hoort imho niet toegepast te worden op het allerlaagste nivo. Zelfs martin fowler (schrijven van UML destilled) geeft zelf toe dat UML overrated is. Het gaat erom of jij het model goed in je geest kan visualiseren en als je daar nu een tool voor nodig bent of niet maakt niet zoveel uit.

Het genereren van veel code laat ik fijn aan mijn IDE over. Hierop heb je meestal wel een optie: implement all abstract methods.

[ Voor 11% gewijzigd door Alarmnummer op 29-01-2004 20:20 ]

Pagina: 1