En metod kan ta en Type som argument.
Typkontrollerande kod är ofta en indikation på att man inte lyckats med objektarkitekturen riktigt. Visst finns det undantag, men man bör i alla fall ta sig en funderare på om man är rätt ute.
8 svar · 569 visningar · startad av Lukaspojken
Finns det något sätt man kan skicka ner en klass till en metod? Det jag skulle vilja är något i stil med nedan. Man skickar in klassen "GroupContainer" till metoden CheckType.
container.CheckType(GroupContainer)
Public Function CheckType(Of container As Class)() As Boolean
Anledningen för att jag vill ha en sådan metod är för att slippa skriva denna rad varje gång.
If container IsNot Nothing AndAlso TypeOf container Is GroupContainer Then
En metod kan ta en Type som argument.
Typkontrollerande kod är ofta en indikation på att man inte lyckats med objektarkitekturen riktigt. Visst finns det undantag, men man bör i alla fall ta sig en funderare på om man är rätt ute.
Om jag använder mig av Type i metoden så krävs det att metod anropet ser ut enligt följande: container.CheckType(GetType(GroupContainer))
Genom generics så har jag lyckats få till det men jag är inte riktigt nöjd med metodanropet:
Public Function CheckType(Of className)() As Boolean
Dim retVal As Boolean = False
If Me IsNot Nothing AndAlso TypeOf Me Is className Then
retVal = True
End If
Return retVal
End Function
Anropet till metoden blir alltså:
If container.CheckType(Of GroupContainer)() Then
Jag skulle vilja få till det på detta sätt:
If container.CheckType(GroupContainer) Then
Jag antar att det inte går men om någon vet hur man skulle kunna få till det så får ni gärna säga till!
Lukaspojken skrev:
Anledningen för att jag vill ha en sådan metod är för att slippa skriva denna rad varje gång.
If container IsNot Nothing AndAlso TypeOf container Is GroupContainer Then
Du skulle fortfarande bli tvungen att kolla om container är Nothing, för om den är det får du ett nullpekarfel när du anropar CheckType. Du kan inte anropa en metod på Nothing...
Så varför duger in det som du har fått fram?
Lukaspojken skrev:
Jag skulle vilja få till det på detta sätt:
If container.CheckType(GroupContainer) Then
Går inte.
Mycket slit för att bygga en dålig funktion. Kan du inte förklara vad som är grundproblemet, så kanske vi kan komma fram till en bättre lösning?
Anledningen för att jag skulle vilja ha en sådan funktion är att man slipper använda sig av onödigt långa if-satser. Vi antar att vi även måste lägga till container.active i de flesta if-satser. Då måste utvecklaren skriva tre villkor varje gång och det känns som att if-satsen blir onödigt komplicerad. Risken för att utvecklaren missar ett viktigt villkor ökar också.
Men jag börjar misstänka att det inte riktigt går att lösa på ett smart sätt.
kan du inte bara skriva en metod som gör de tre olika checkarna och sen returnerar om de gått bra eller ej? eller förenklar jag problemet nu?
"Tell, don't ask" är en viktig princip att ta fasta på. Man ska be instanserna om saker, inte fråga dem vad de är för något. I detta fallet är det tydligen så att en GroupContainer ska hanteras annorlunda. Då är det snyggare att basklassen/interfacet har en IsGroup-egenskap som returnerar true från GroupContainer.