31. august 2005 - 10:39Der 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.
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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
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
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.
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.
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.