webForumDet fria alternativet

Skicka ner en klass (ej objekt) till en metod?

.NET

8 svar · 569 visningar · startad av Lukaspojken

Medlem sedan maj 20011 312 inlägg
Frågan#1

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
Medlem sedan dec. 19996 721 inlägg
#2

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.

Medlem sedan maj 20011 312 inlägg
#3

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!

Medlem sedan juni 20008 205 inlägg
#4

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...

Medlem sedan nov. 20014 054 inlägg
#5

Så varför duger in det som du har fått fram?

Medlem sedan dec. 19996 721 inlägg
#6

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?

Medlem sedan maj 20011 312 inlägg
#7

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.

Medlem sedan juli 200799 inlägg
#8

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?

Medlem sedan dec. 19996 721 inlägg
#9

"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.

272 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)