[VB.net] OO - In parent weten welke child ge-init wordt

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 01-10 10:45

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
Okay titel is misschien wat wazig, maar het gaat om vb.net waarin ik een aantal classes heb met overerving.
Het zijn dataconnector variabelen die op een specifiek platform moeten gaan werken.

Ik heb een parent class
[myVariable]
met child classes.
[myVarInteger] [myVarString] [myVarReal]

ze heten bij mij iets anders, maar dit lijkt me het duidelijkst voor jullie.

De class myVariable, verzorgt de new()

Maar is het nu ook mogelijk om in de myVariable te weten welke childclass er gebruikt is?
Dus stel ik doe:
[myVarString].new()

Dan wordt uiteraard de new van [myVariable] aangeroepen, maar kan ik hier ook achterkomen in de new() functie zelf?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Me.GetType() :?

/Edit:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Module Armageddon_2k

    Sub Main()
        Dim x = New MyInteger()
        Dim y = New MyString()

        Console.ReadLine()
    End Sub

End Module

MustInherit Class MyVariable
    Public Sub New()
        Console.WriteLine(Me.GetType().Name)
    End Sub
End Class

Class MyInteger
    Inherits MyVariable
End Class

Class MyString
    Inherits MyVariable
End Class

MyInteger
MyString

[ Voor 96% gewijzigd door RobIII op 13-07-2011 15:08 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 01-10 10:45

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
|:( |:( |:(
Thanks, had al even een testje gemaakt.
Wat stom zeg, ik was er heilig van overtuigd dat ik daarmee de parent zou terug krijgen.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Armageddon_2k schreef op woensdag 13 juli 2011 @ 15:05:
|:( |:( |:(
Thanks, had al even een testje gemaakt.
Wat stom zeg, ik was er heilig van overtuigd dat ik daarmee de parent zou terug krijgen.
Doe me een lol en doe dat voortaan eerst. Zitten we onze tijd niet voor niets te verdoen ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 01-10 10:45

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
RobIII schreef op woensdag 13 juli 2011 @ 15:07:
[...]
Doe me een lol en doe dat voortaan eerst. Zitten we onze tijd niet voor niets te verdoen ;)
Nee ik had een voorbeeld test gemaakt toen jij met GetType() kwam, dus je hebt jij tijd niet lopen verdoen.
Dus zonder je hulp was ik nog aan het dobberen geweest :P

[ Voor 9% gewijzigd door Armageddon_2k op 13-07-2011 15:08 ]


Acties:
  • 0 Henk 'm!

  • Bu588
  • Registratie: Maart 2000
  • Laatst online: 29-07 16:22
Je moet je wel afvragen of het een goed idee is dat een parent weet door welke childclass hij wordt aangeroepen. Normaalgesproken wil je toch voorkomen dat dit gebeurt omdat je dan logica in de parent zou opnemen die specifiek voor childs is (en dus in de child zou moeten staan)?

Nothing is fool-proof to a sufficiently talented fool...


Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 01-10 10:45

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
Bu588 schreef op woensdag 13 juli 2011 @ 15:15:
Je moet je wel afvragen of het een goed idee is dat een parent weet door welke childclass hij wordt aangeroepen. Normaalgesproken wil je toch voorkomen dat dit gebeurt omdat je dan logica in de parent zou opnemen die specifiek voor childs is (en dus in de child zou moeten staan)?
Dr zitten een aantal functies in die door de parent worden uitgevoerd waaronder een Initializer() functie.
Deze worden uitgevoerd met child specifieke eigenschappen. (bijvoorbeeld message bitsize).
Als er wat misgaat in de Initializer, vindt ik het wel prettig om te weten om welke childclass het gaat.

Acties:
  • 0 Henk 'm!

  • Bu588
  • Registratie: Maart 2000
  • Laatst online: 29-07 16:22
In dat geval zou ik de child-specifieke eigenschappen laten doen door een functie in de child. Door die als een abstracte functie te definieren in de parent, dwing je jezelf om elke child te voorzien van deze functie. De returncode van deze functie kun je gebruiken om te controleren of hij succesvol werd uitgevoerd, zo niet dan kun je in de parent een exception genereren waarin je met de getType() functie de naam van de echte class opneemt. Dit voorkomt dat je bij toevoegen van een nieuwe child ook de parent moet aanpassen, wat volgens mij een van de doelen is van OO-programmeren (toch?).

Nothing is fool-proof to a sufficiently talented fool...


Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 01-10 10:45

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
Bu588 schreef op woensdag 13 juli 2011 @ 15:23:
In dat geval zou ik de child-specifieke eigenschappen laten doen door een functie in de child. Door die als een abstracte functie te definieren in de parent, dwing je jezelf om elke child te voorzien van deze functie. De returncode van deze functie kun je gebruiken om te controleren of hij succesvol werd uitgevoerd, zo niet dan kun je in de parent een exception genereren waarin je met de getType() functie de naam van de echte class opneemt. Dit voorkomt dat je bij toevoegen van een nieuwe child ook de parent moet aanpassen, wat volgens mij een van de doelen is van OO-programmeren (toch?).
In sommige gevallen ben ik dat met je eens, maar de Initializer functie is in elk opzicht hetzelfde op een aantal parameters na. Je zou dan een 10 regels code in al je child classes terug zien komen. Met als enige verschil een paar MessageSizes. Vind ik nou niet echt fraai.

En ik kan trouwens Chilclasses toevoegen wat ik wil, ik hoef mn parent niet aan te passen. Maargoed dat is een leuke discussie als jij niet weet hoe de code er uitziet en waar het voor gebruikt wordt.

[ Voor 9% gewijzigd door Armageddon_2k op 13-07-2011 15:29 ]


Acties:
  • 0 Henk 'm!

  • Big Womly
  • Registratie: Oktober 2007
  • Laatst online: 01-09 13:39

Big Womly

Live forever, or die trying

Armageddon_2k schreef op woensdag 13 juli 2011 @ 15:26:
[...]


In sommige gevallen ben ik dat met je eens, maar de Initializer functie is in elk opzicht hetzelfde op een aantal parameters na. Je zou dan een 10 regels code in al je child classes terug zien komen. Met als enige verschil een paar MessageSizes. Vind ik nou niet echt fraai.

En ik kan trouwens Chilclasses toevoegen wat ik wil, ik hoef mn parent niet aan te passen. Maargoed dat is een leuke discussie als jij niet weet hoe de code er uitziet en waar het voor gebruikt wordt.
Maar nog altijd fraaier dan dat je parent class die gaat uitvoeren voor je child classes.
Wat eigen is aan de child class moet in de child class blijven, en daarmee basta! :P

schrijf die gemeenschappelijke regels code in je parent class en die specifieke regels in je child class en laat dan je child functie de parent functie oproepen.

Is het geheime code, of kan je die met ons delen? Want ik kan mij echt geen situatie inbeelden waarbij je moet weten wat voor type je child is zonder dat je dat moet aanpassen als je nieuwe child classes definieerd.

[ Voor 10% gewijzigd door Big Womly op 13-07-2011 15:34 ]

When you talk to God it's called prayer, but when God talks to you it's called schizophrenia


Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 01-10 10:45

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
Again, alle code in de parent is hetzelfde alleen puur de parametes zijn verschillend.

Maargoed ik ga kappen met discussie, ik heb hier een deel van de code neer gezet specifiek voor het "probleem" waar ik een oplossing voor zocht. Als je over het hele ontwerp commentaar wilt leveren, jammer dan want je weet niet hoe het ontwerp in z'n totaliteit inelkaar staat.

Acties:
  • 0 Henk 'm!

  • Big Womly
  • Registratie: Oktober 2007
  • Laatst online: 01-09 13:39

Big Womly

Live forever, or die trying

Ok, got your point

maar denk toch even na over deze situatie:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Abstract Class Parent
  Function fp()
    'Die 10 regels code
    HandleChildSpecific()
  End Function
  
  Abstract Function HandleChildSpecific()
End Class

Class Child
  Function HandleChildSpecific()
    'Hier je child specifieke code
  End Function
End class

When you talk to God it's called prayer, but when God talks to you it's called schizophrenia


Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 27-09 13:36
Big Womly schreef op woensdag 13 juli 2011 @ 15:44:
Ok, got your point

maar denk toch even na over deze situatie:
Als ik het goed heb moet je nu wel uitkijken dat je je 'fp' functie niet in de constructor van Parent gaat aanroepen, omdat je dan een virtual (nou ja, abstracte) method in je constructor aanroept. Ok, niet direct maar wel indirect, ik weet niet of het dan nog steeds een probleem is? Het probleem normaal namelijk is dat de constructor van je Child nog niet gedaan is, de virtual method wordt dus uitgevoerd in Child voordat de constructor van Child uitegvoerd is; als de implementatie van die virtual method dus afhangt van iets wat in de constructor van Child geinitializeerd wordt gaat het mis.

Verder heet een abstract class in VB 'MustInherit' en een abstract method 'MustOverride', maar goed, wie onthoudt dat :+


Verder ben ik het wel eens; het is absoluut niet goed om child-specifieke zaken in je parent te gaan regelen. Als die initializatie code vrijwel hetzelfde is en je die niet wilt kopieren dan zet je dus alle code die inderdaad hetzelfde is in de parent, en alle delen die specifiek zijn per child in je childs. Dat is nou net het nut van inheritance, beetje vreemd om dat te negeren 8)7

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Armageddon_2k schreef op woensdag 13 juli 2011 @ 15:35:
Als je over het hele ontwerp commentaar wilt leveren, jammer dan want je weet niet hoe het ontwerp in z'n totaliteit inelkaar staat.
Sommige mensen hebben niet meer nodig dan 15 regels code om een antipattern te herkennen...

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Aangezien je dacht dat je in de GetType() de parent terug zou krijgen, heb ik het gevoel dat je niet snapt hoe polymorfisme werkt bij overerving. Je antipattern van kennis van subclasses in de parent kan hier mogelijk ook mee worden opgelost: de Initializer die nu kind-specifieke code aanroept, kan worden vervangen door een Initializer in de parent die parent specifieke dingen doet en een override van die Initializer in elk child die de parent Initializer aanroept en daarna z'n eigen ding doet.

Dat of een Initializer die een template method aanroept die je in elk child implementeert.

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 30-09 16:40

Janoz

Moderator Devschuur®

!litemod

Armageddon_2k schreef op woensdag 13 juli 2011 @ 15:26:
[...]


In sommige gevallen ben ik dat met je eens, maar de Initializer functie is in elk opzicht hetzelfde op een aantal parameters na. Je zou dan een 10 regels code in al je child classes terug zien komen. Met als enige verschil een paar MessageSizes. Vind ik nou niet echt fraai.
Het hele idee dat een parent daadwerkelijk wat van de implementaite van zijn child moet weten is gewoon brak. Dat klopt niet. Dat jij geen fatsoenlijke oplossing denkt te kunnen verzinnen betekent niet dat die er niet is.

Je hoeft bijvoorbeeld niet de hele initializer functie abstract te maken. Je kunt ook een abstracte getMessageSizeX methode maken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01-10 23:36

.oisyn

Moderator Devschuur®

Demotivational Speaker

Of die gegevens meegeven in de ctor van de base class.

Ik ben het eens met de opmerking over het oppassen met aanroepen van een derived method vanuit de base constructor, da's vragen om moeilijkheden. In "sommige" talen kan dat niet eens ;)

[ Voor 64% gewijzigd door .oisyn op 13-07-2011 17:03 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 30-09 16:40

Janoz

Moderator Devschuur®

!litemod

Daarom heb ik het ook expliciet over een abstracte method. Maar het meegeven aan de constructor is onderdaad een nog nettere oplossing.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • apokalypse
  • Registratie: Augustus 2004
  • Laatst online: 02-10 18:36
Armageddon_2k schreef op woensdag 13 juli 2011 @ 15:35:
Maargoed ik ga kappen met discussie, ik heb hier een deel van de code neer gezet specifiek voor het "probleem" waar ik een oplossing voor zocht. Als je over het hele ontwerp commentaar wilt leveren, jammer dan want je weet niet hoe het ontwerp in z'n totaliteit inelkaar staat.
Wel hulp willen, terwijl het heel basic materie is, maar een goede kritische vraag wordt afgedankt. Beetje jammer.

[ Voor 3% gewijzigd door apokalypse op 13-07-2011 17:14 ]


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Ik denk dat het ook verstandig is, dat je een keer het Open/Closed Principe leest.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01-10 23:36

.oisyn

Moderator Devschuur®

Demotivational Speaker

Janoz schreef op woensdag 13 juli 2011 @ 17:10:
Daarom heb ik het ook expliciet over een abstracte method.
:?
Ik heb het erover dat het potentieel gevaarlijk is om een (al dan niet abstracte) method aan te roepen vanuit de base ctor die in de derived class overridden is, omdat de ctor van de derived dan nog niet is aangeroepen. De method abstract maken verandert daar niets aan :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 30-09 16:40

Janoz

Moderator Devschuur®

!litemod

Tjongejonge, ik ben niet scherp :).. Ik zat met mijn hoofd in die apparte (niet constructor) initialize functie en was even vergeten dat die al vanuit de constructor aangeroepen zou worden. Ik dacht dat je opmerking meer sloeg op het "design for extention".

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 01-10 10:45

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
Janoz schreef op woensdag 13 juli 2011 @ 17:00:
[...]
Je hoeft bijvoorbeeld niet de hele initializer functie abstract te maken. Je kunt ook een abstracte getMessageSizeX methode maken.
Nou toch maar even op de discussie inspringen.
Wat jij hier zegt, is precies hoe ik het inelkaar heb steken.
Goed, ik pleur het hier neer.

Parent
Visual Basic .NET:
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
    Friend MustOverride Sub GetAdsStreamLength()

    '*****Constructor()*****
    'Creates a new instance of the object
    Public Sub New(ByRef Client As TwinCatConnection, ByVal TagName As String, Optional ByVal Cycletime As Long = 200, Optional ByVal Adstransmode As AdsTransMode = AdsTransMode.OnChange)

        TagName = TagName
        TcAdsClient = Client.TcClient
        AdsStreamLength = GetAdsStreamLength()
        AdsStream = New AdsStream(AdsStreamLength)

        InitializeComponent(Cycletime, Adstransmode)
    End Sub

    '*****InitializeComponent()*****
    'Initilizes the component
    Private Sub InitializeComponent(ByVal Cycletime As Long, ByVal Adstransmode As AdsTransMode)
        Dim DataStream As New AdsStream(AdsStreamLength)  'DataStream for reading current value

        Try
            If TcAdsClient.IsAlive Then

                'Add notification handle for datachange events (handled in TwinCatRuntime)
                DeviceNotification = TcAdsClient.AddDeviceNotification(TagName, AdsStream, Adstransmode, CInt(Cycletime), 0, Me)

                'Get variable handle for manual read/write actions
                VariableHandle = TcAdsClient.CreateVariableHandle(TagName)

                'Read current value (executed by child of TwinCatVariable)
                TcAdsClient.Read(VariableHandle, DataStream)
                AdsStreamReadValue(DataStream)

                id = AddTagEntry(TagName)
            End If

        Catch ex As AdsErrorException

            Dim exception As AdsErrorException = ex

                If MessageBox.Show(("Connecting to variable <" & TagName & ">" & vbCrLf & _
                                 exception.Message), "Class xxxxx", MessageBoxButtons.OKCancel, _
                                 MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1) = DialogResult.Cancel Then

            End If

        End Try

        DataStream = Nothing
    End Sub


De Child implementeert de "GetAdsStreamLength".

En de enige reden waarom ik dus wil weten welke child ik mee bezig ben, is voor de error message.
De TcAdsClient is "Semi-gedocumenteerd" en doet dus soms spontaan dingen die ik niet wil.
En het is dan makkelijk om te weten of zich dit bij alle variabelen (String/Bool/Int) voordoet, of alleen voor een specifieke.

Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 01-10 10:45

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
apokalypse schreef op woensdag 13 juli 2011 @ 17:13:
[...]
Wel hulp willen, terwijl het heel basic materie is, maar een goede kritische vraag wordt afgedankt. Beetje jammer.
Beetje jammer dat mensen altijd bij voorbaat al hebben bedacht wat iemand fout doet, prima als je commentaar gaat geven als ik de hele code neer gooi. En als je commentaar hebt op de code die ik net post, prima, geen moeite mee.

Maar als iemend voor zichzelf gaat bedenken wat ik wil gaan doen met die GetType() functie, en daardoor maar besluit dat het hele ontwerp scheef is, dat vind ik een beetje jammer.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01-10 23:36

.oisyn

Moderator Devschuur®

Demotivational Speaker

Even voor de duidelijkheid, je wilt dus op de plek van "Class xxxxx" op regel 41 de naam van de concrete klasse hebben?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 30-09 16:40

Janoz

Moderator Devschuur®

!litemod

En iets als Me.GetType() werkt niet omdat?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 01-10 10:45

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
Even voor de duidelijkheid, je wilt dus op de plek van "Class xxxxx" op regel 41 de naam van de concrete klasse hebben?
Yup
Janoz schreef op donderdag 14 juli 2011 @ 11:17:
En iets als Me.GetType() werkt niet omdat?
Dat werkt prima, maar ik kon er niet opkomen :P
Dit was de code "Voor" de aanpassing met Me.GetType.

[ Voor 34% gewijzigd door Armageddon_2k op 14-07-2011 11:29 ]

Pagina: 1