Avatar billede bjornhart Nybegynder
31. august 2005 - 10:39 Der er 10 kommentarer og
1 løsning

Skrive sin egen klasse som arver fra en anden

Jeg er ved at lave noget sikkerhed på min side vha. formsauthentication. I den forbindelse har jeg behov for at lave min egen Principal klasse da GenericPrincipal mangler noget funktionalitet som jeg skal bruge. Hvordan gør jeg det?

Har prøvet:
Public Class CustomPrincipal
    Implements IPrincipal

    Private _identity As IIdentity
    Private _roles As String()

    Public Sub New(ByVal identity As IIdentity, ByVal roles As String())

    End Sub
    Public Sub CustomPrincipal(ByVal identity As IIdentity, ByVal roles As String())
        _identity = identity
        _roles = roles
        roles.CopyTo(_roles, 0)
        Array.Sort(_roles)
    End Sub

    Public Overridable Function IsInRole(ByVal role As String) As Boolean
        Return Microsoft.VisualBasic.IIf(Array.BinarySearch(_roles, role) > 0, True, False)
    End Function

    Public Overridable Property Identity() As IIdentity
        Get
            Return _identity
        End Get
        Set(ByVal Value As IIdentity)

        End Set
    End Property

    End Function


End Class

Det giver flg. fejl:
c:\inetpub\wwwroot\mysqlprojekt\Global.asax.vb(9): 'mysqlprojekt.CustomPrincipal' must implement 'Overridable Function IsInRole(role As String) As Boolean' for interface 'System.Security.Principal.IPrincipal'.
c:\inetpub\wwwroot\mysqlprojekt\Global.asax.vb(9): 'mysqlprojekt.CustomPrincipal' must implement 'Overridable ReadOnly Property Identity() As IIdentity' for interface 'System.Security.Principal.IPrincipal'. Implementing property must have matching 'ReadOnly'/'WriteOnly' specifiers.

Kan nogen hjælpe?
Avatar billede nielle Nybegynder
31. august 2005 - 10:46 #1
Som fejlbeskeden siger:

Du skal skrive (implementere) funktionen:

IsInRole()

- samt propertyen:

Identity

- med både en Get og en Set.
Avatar billede bjornhart Nybegynder
31. august 2005 - 10:48 #2
Jo det er rigtigt, men er det ikke også det jeg har gjort?
Avatar billede nielle Nybegynder
31. august 2005 - 10:48 #3
Glem det meste af hvad jeg skrev, men du mangler i hvert fald noget kode i din Set fopr at det vil virke.
Avatar billede nielle Nybegynder
31. august 2005 - 10:49 #4
Public Overridable Property Identity() As IIdentity
    Get
        Return _identity
    End Get
    Set(ByVal Value As IIdentity)
        _identity = Value  ' Mit gæt
    End Set
End Property
Avatar billede bjornhart Nybegynder
31. august 2005 - 10:50 #5
Det er en readonly poperty så klassen skal se således ud:

Public Class CustomPrincipal
    Implements IPrincipal

    Private _identity As IIdentity
    Private _roles As String()

    Public Sub New(ByVal identity As IIdentity, ByVal roles As String())

    End Sub
    Public Sub CustomPrincipal(ByVal identity As IIdentity, ByVal roles As String())
        _identity = identity
        _roles = roles
        roles.CopyTo(_roles, 0)
        Array.Sort(_roles)
    End Sub

    Public Overridable Function IsInRole(ByVal role As String) As Boolean
        Return Microsoft.VisualBasic.IIf(Array.BinarySearch(_roles, role) > 0, True, False)
    End Function

    Public Overridable ReadOnly Property Identity() As IIdentity
        Get
            Return _identity
        End Get
       
    End Property
End Class
Avatar billede nielle Nybegynder
31. august 2005 - 10:52 #6
I følge fejlbeskeden skal du implementere både Set og Get.
Avatar billede nielle Nybegynder
31. august 2005 - 10:55 #7
Ahhh ... du skal bruge Overrides keywordet i den klasse som arver. Ikke Overridable.
Avatar billede bjornhart Nybegynder
31. august 2005 - 10:58 #8
okay. Fejlen jeg får er nu:

c:\inetpub\wwwroot\mysqlprojekt\Global.asax.vb(24): function 'IsInRole' cannot be declared 'Overrides' because it does not override a function in a base class.
c:\inetpub\wwwroot\mysqlprojekt\Global.asax.vb(28): property 'Identity' cannot be declared 'Overrides' because it does not override a property in a base class.
Avatar billede nielle Nybegynder
31. august 2005 - 11:06 #9
Ok, jeg kan se at jeg øjensynligt ikke er stået helt ud af sengen endnu. I følge din overskrift arver du fra en klasse, men det er i virkeligheden ikke det du er ved at gøre - i stedet er du ved at implementere et interface.

Det skal selvfølgeligt være Overridable i det første "led i fødekæden". Det er først når at du begynder at arve fra din klasse at det bliver til Overrides.

Må jeg spørge om hvorfor din klasse ikke simpelthen arver fra GenericPrincipal klassen, og blot modifisere på denne? Det må da være nemmere end at skrive alt funktionaliteten helt fra bunden af.
Avatar billede bjornhart Nybegynder
31. august 2005 - 11:13 #10
Du har selvfølgelig ret. Jeg er bare ny :-) Det her virker:

Public Class CustomPrincipal
    Inherits GenericPrincipal

    Private _mapper As String()

    Public Sub New(ByVal identity As System.Security.Principal.IIdentity, ByVal roles() As String)
        MyBase.New(identity, roles)
    End Sub

    Public Sub MappeRettigheder(ByVal mapper() As String)
        mapper.CopyTo(_mapper, 0)
        Array.Sort(_mapper)
    End Sub

End Class

Tak for hjælpen sender du et svar
Avatar billede nielle Nybegynder
31. august 2005 - 11:14 #11
Svar :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester