Solved

Extremely Challanging Question

Posted on 2004-05-02
17
190 Views
Last Modified: 2011-09-20
Hi,

I have a class which is inherited form many classes... Say ClassBase.

ClassDerive is inheriting ClassBase.

From a SHARED method in classbase, I would like to programatically see the name or type of the deriving class i.e. "ClassDerive"... I cannot use the gettype as it needs an instance or the name of the class (which is what I am looking for)...

Any help extremely appreciated.
0
Comment
Question by:igalnassi
  • 6
  • 5
  • 3
  • +1
17 Comments
 
LVL 44

Expert Comment

by:Arthur_Wood
ID: 10974060
Cannot be done, as the base class has no idea that it IS being used as the baseclass for ANY actually existing 'derived' class.

Just because you have a Class cAnimal does NOT in and of itself require that there be a Class cTiger that inherits from cAnimal.  And cAnimal has no way of finding out that cTiger (or any other cXXX exists, that inherits from cAnimal)

What are you trying to accomplish with this?

AW
0
 

Author Comment

by:igalnassi
ID: 10974129
I know that... I want the CTiger.SharedMethod(), which is an inherited to be able to understand it is in CTiger. I am not going to call CAnimal.SharedMethod() and then try to get CTiger...

Thanks anyway Arthur... Any more comments deeply appreciated and will be rewarded...
0
 
LVL 37

Expert Comment

by:gregoryyoung
ID: 10975200
I sat here and thought about this one for a while.

I hate to be the one to say this but there IS a way to do this ... its a pain in the butt but there is.

Before I go into how you can do this I feel it important to note that this is what instance members are for. Doing this within an instance member is trivial. I think I know a situation similar to what you are trying to do here. Create a Singleton base class. There are other patterns for this.

ok method 1 (easiest)
pass in a type to the method

public shared foo(Type _Type)
class.foo(typeof(class))

the second situation is much more complex and would involve using some stuff presented here http://msdn.microsoft.com/msdnmag/issues/02/11/CLRDebugging/default.aspx.

I dont think that is really what should be done and is no way safe or "good" code.

Greg
0
Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

 
LVL 4

Expert Comment

by:rehand
ID: 10980376
Hmm...

Why not create an Overridable function that provides this information.
0
 
LVL 4

Expert Comment

by:rehand
ID: 10980397
Public Class Class1
    Public Overridable Function WhoAmI() As String
        WhoAmI = "Class1"
    End Function
End Class

Public Class Class2
    Inherits Class1

    Public Overrides Function WhoAmI() As String
        WhoAmI = "Class2"
    End Function
End Class
0
 
LVL 37

Expert Comment

by:gregoryyoung
ID: 10980594
rehand: note that he said a static (aka shared) method. This means that he will not have access to instance members.
0
 
LVL 4

Expert Comment

by:rehand
ID: 10980757
This works too

Public Class BaseClass
    Public Function WhoAmI() As String
        WhoAmI = Me.GetType.ToString
    End Function
End Class

Public Class Class2
 Inherits BaseClass
End Class

Public Class Class2
 Inherits Class2
End Class

Public Class Form1
    Inherits System.Windows.Forms.Form

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim x As New Class3
        MsgBox(x.WhoAmI())
    End Sub
End Class

Message Box Returns: Class3
0
 
LVL 4

Expert Comment

by:rehand
ID: 10980774
Err the third declare class should have read Class2 instead of Class3 again:

Public Class BaseClass
    Public Function WhoAmI() As String
        WhoAmI = Me.GetType.ToString
    End Function
End Class

Public Class Class2
 Inherits BaseClass
End Class

Public Class Class3
 Inherits Class2
End Class

Public Class Form1
    Inherits System.Windows.Forms.Form

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim x As New Class3
        MsgBox(x.WhoAmI())
    End Sub
End Class

Message Box Returns: Class3
0
 
LVL 37

Expert Comment

by:gregoryyoung
ID: 10980897
again note SHARED/STATIC

doing it with an instance member is trivial thats what they are there for.
0
 

Author Comment

by:igalnassi
ID: 10983754
thanks gregoryyoung...

Basically I might just put a shared Type Property that is overriden on every deriving class. But still it would not solve the problem of reaching to it from the base class...

Can BaseClass.SharedFunction reach DerivedClass.InheritedSharedProperty which is overriden in the DerivedClass do you think?
0
 
LVL 37

Expert Comment

by:gregoryyoung
ID: 10983913
again note SHARED/STATIC

you can only override instance members ...

public shared virtual Foo() { } //gives error as virtual and shared are mutually exclusive
0
 
LVL 4

Expert Comment

by:rehand
ID: 10985872
gregory

I am not sure what you are eluding to with SHARED/STATIC.

I created a baseclass with the WhoAmI method, compiled it, and they create a ChildClass that inherits the base class. I then included the childclass in a new executable an called the WhoAmI procedure of the ChildClass which inherits and does not override the WhoAmI method from the baseclass and the application returned the value: ChildClass.

0
 
LVL 37

Expert Comment

by:gregoryyoung
ID: 10988647
From the original question

"From a SHARED method in classbase, I would like to programatically see the name or type of the deriving class i.e. "ClassDerive"... I cannot use the gettype as it needs an instance or the name of the class (which is what I am looking for)..."

You can not override shared members ... Your point of doing it with instance members works only for other instance members not for shared/static members. It is a good example though of a point which I was tried to make earlier and may not have gotten accross. This is one reason why instance members were created, to solve this problem.

As for the solution the standard way of doing it is to pass in a type to the shared member.

example:
Base Instance(Type TypeToCreate) {
    try {
    Base ret = (Base) CreateInstance(TypeToCreate) ;
    }
    catch (Exception Ex) {
       throw new System.Exception("Type was not convertable to Base or not loadable", Ex) ;
    }
    return Base
}

or you can pass in an instance to work on ...
0
 

Author Comment

by:igalnassi
ID: 11098703
Thanks I have solved the problem by putting the type as an argument from the Deriving class.

Thanks for all your support anyway

Igal
0
 
LVL 37

Accepted Solution

by:
gregoryyoung earned 500 total points
ID: 11099705
umm I suggested that in my first post ...

"ok method 1 (easiest)
pass in a type to the method"
0

Featured Post

Networking for the Cloud Era

Join Microsoft and Riverbed for a discussion and demonstration of enhancements to SteelConnect:
-One-click orchestration and cloud connectivity in Azure environments
-Tight integration of SD-WAN and WAN optimization capabilities
-Scalability and resiliency equal to a data center

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
VB.net Facial recognition software (time and attendance) 6 60
VB.NET 2008 Publish Error 2 32
No Data for DropDown List 2 28
VB.net Open video relating to control 2 19
Introduction When many people think of the WebBrowser (http://msdn.microsoft.com/en-us/library/2te2y1x6%28v=VS.85%29.aspx) control, they immediately think of a control which allows the viewing and navigation of web pages. While this is true, it's a…
If you need to start windows update installation remotely or as a scheduled task you will find this very helpful.
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…

807 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question