[Last Call] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 349
  • Last Modified:

Overloading a built-in function

I have created a custom role provider, in it there is:
 Public Overrides Function GetRolesForUser(ByVal username As String) As String()

I want to create my own function, so I have created an Overloaded one:

Public Overloads Function GetRolesForUser(ByVal level As Integer) As String()

However, when I call it and pass in an integer, it always goes to the first one, not my overloaded one.

Dim myroles As Array = Roles.GetRolesForUser(Level)

What am I missing?

thanks.



0
Starr Duskk
Asked:
Starr Duskk
  • 7
  • 7
  • 4
2 Solutions
 
imitchieCommented:
What type is "Level"?
0
 
imitchieCommented:
Public Overrides Overloads Function GetRolesForUser(ByVal level As Integer) As String()
0
 
Jaime OlivaresCommented:
First version should have the Overloads keyword too.
0
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 
Jaime OlivaresCommented:
oops, imitchie has already stated that
0
 
Starr DuskkASP.NET VB.NET DeveloperAuthor Commented:
No, my new function is not in the base class with an Integer variable, so I can't override it.... I had already tried that.

Compiler Error Message: BC30284: function 'GetRolesForUser' cannot be declared 'Overrides' because it does not override a function in a base class.
0
 
imitchieCommented:
I meant the string one. Jaime pointed out the right one. It both overrides the virtual, and also overloads the other one.
0
 
imitchieCommented:
The catch is that you cannot get to the Int version from the Base class, i.e.

:base: (a)
Public Virtual Function GetRolesForUser(ByVal username As String)

:derived: (b), (c)
Public Overloads Overrides Function GetRolesForUser(ByVal username As String) As String()
Public Overloads Function GetRolesForUser(ByVal level As Integer) As String()

Dim a as base
a = new derived();
dim s as string
base.GetRolesForUser(s) - calls (b)
((derived)a).GetRolesForUser(s) - calls (b)
((derived)a).GetRolesForUser(123) - calls (c)
a.GetRolesForUser(123) - calls (b) [ or throws invalid cast exception ]
0
 
Jaime OlivaresCommented:
as an alternative you can forget to derive but compose instead, so you will have total freedom to define your methods:


Public Class A 
    Private obj As B 
    
    Public Sub New() 
        obj = New B() 
    End Sub 
 
     ' override is not needed
     Public Overloads Function GetRolesForUser(ByVal username As String) As String()
             ' call obj.GetRolesForUser() here
     End function
     Public Overloads Function GetRolesForUser(ByVal level As Integer) As String()
             ' call obj.GetRolesForUser() here
     End function
 
     ' Implement other methods and properties needed, just wrap the members from class B
End Class 

Open in new window

0
 
Starr DuskkASP.NET VB.NET DeveloperAuthor Commented:
Sorry, ya'll have totally lost me.

I have an overloaded GetUser method in my custom provider and it simply has me pass in a username, without the logged in value, and it hits it every time.

I dont' understand why this one doesn't and I don't understand what you're asking me to do. Are you asking me to just forget the custom roles and create my own class which has methods using the same name? Cause that's what it looks like.
0
 
Jaime OlivaresCommented:
I am talking about forgetting the inheritance approach and use a wrapper instead.
A wrapper will give you a better freedom to define your overloaded methods and expose just the methods and properties you want.
But as I mentioned, this is just an alternative.
0
 
Starr DuskkASP.NET VB.NET DeveloperAuthor Commented:
Do I put that derived class in my customMembershipProvider?

And if so, how do I call it?

Remember, I'm a noob. I don't know what wrapping is.

thanks.
0
 
Jaime OlivaresCommented:
inheriting:

class baseClass
{
}

class derivedClass : baseClass
{
}

wrapping:

class baseClass
{
}

class wrapperClass
{
        baseClass instance;
}

Please read my previous comments about the advantages of a wrapper class for your case.
0
 
Starr DuskkASP.NET VB.NET DeveloperAuthor Commented:
Sooo.....

In answer to my questions?

Do I put that derived class in my customMembershipProvider?

And if so, how do I call it?

0
 
Starr DuskkASP.NET VB.NET DeveloperAuthor Commented:
Okay, I have the class written within my customMembershipProvider file at the bottom of the main class.

But I still don't know how to call it?

Because if I use:
myUser = Membership.GetUser(userID)

It only offers me the original two methods.

How do I call it please?

thanks.

0
 
Jaime OlivaresCommented:
could you post the full source code?
0
 
Starr DuskkASP.NET VB.NET DeveloperAuthor Commented:
I am unable to post my source code. It's proprietary.

Whether it's GetRolesforUser or GetUser, there has to be a way to all it and tell it to use the wrapped class you suggest.

How does one call a wrapped class?




0
 
Jaime OlivaresCommented:
I cannot help you if I don't know where you derived your class from.
0
 
Starr DuskkASP.NET VB.NET DeveloperAuthor Commented:
Nevermind. I asked it a different way in another question and got my answer.
thanks!
0

Featured Post

NFR key for Veeam Backup for Microsoft Office 365

Veeam is happy to provide a free NFR license (for 1 year, up to 10 users). This license allows for the non‑production use of Veeam Backup for Microsoft Office 365 in your home lab without any feature limitations.

  • 7
  • 7
  • 4
Tackle projects and never again get stuck behind a technical roadblock.
Join Now