www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Find the heir.

reply TodNaz <hello.humanaz gmail.com> writes:
Hello!
class A
{
    ...
}

class B : A
{
    ...
}

class C : A
{
    ...
}

A example1;
B example2 = new B(...);
A = example2;
auto heir = A.whoheir(); ///
The question in this code is: is it possible to track the class inheritor? Or is it beyond D? Sorry if the question is fool ...
Mar 29 2020
next sibling parent Stefan Koch <uplink.coder gmail.com> writes:
On Sunday, 29 March 2020 at 14:04:53 UTC, TodNaz wrote:
 Hello!
class A
{
    ...
}

class B : A
{
    ...
}

class C : A
{
    ...
}

A example1;
B example2 = new B(...);
A = example2;
auto heir = A.whoheir(); ///
The question in this code is: is it possible to track the class inheritor? Or is it beyond D? Sorry if the question is fool ...
It is not generally known who has inherited a class from the parents perspective.
Mar 29 2020
prev sibling parent reply Simen =?UTF-8?B?S2rDpnLDpXM=?= <simen.kjaras gmail.com> writes:
On Sunday, 29 March 2020 at 14:04:53 UTC, TodNaz wrote:
 Hello!
class A
{
    ...
}

class B : A
{
    ...
}

class C : A
{
    ...
}

A example1;
B example2 = new B(...);
A = example2;
auto heir = A.whoheir(); ///
The question in this code is: is it possible to track the class inheritor? Or is it beyond D? Sorry if the question is fool ...
The question is a bit unclear - what is whoheir expected to return? This is one way that may or may not fulfill your requirements: module foo; class A { string whoheir() { return typeid(this).name; } } class B : A {} class C : A {} unittest { A a = new B(); assert(a.whoheir == "foo.B"); a = new C(); assert(a.whoheir == "foo.C"); } -- Simen
Mar 29 2020
parent WebFreak001 <d.forum webfreak.org> writes:
On Sunday, 29 March 2020 at 15:07:37 UTC, Simen Kjærås wrote:
 On Sunday, 29 March 2020 at 14:04:53 UTC, TodNaz wrote:
 Hello!
class A
{
    ...
}

class B : A
{
    ...
}

class C : A
{
    ...
}

A example1;
B example2 = new B(...);
A = example2;
auto heir = A.whoheir(); ///
The question in this code is: is it possible to track the class inheritor? Or is it beyond D? Sorry if the question is fool ...
The question is a bit unclear - what is whoheir expected to return? This is one way that may or may not fulfill your requirements: module foo; class A { string whoheir() { return typeid(this).name; } } class B : A {} class C : A {} unittest { A a = new B(); assert(a.whoheir == "foo.B"); a = new C(); assert(a.whoheir == "foo.C"); } -- Simen
to extend on this: typeid(...) returns a TypeInfo so you can perform a bit of runtime reflection, see https://dlang.org/phobos/object.html#.TypeInfo To check for exact matches if your class is B or C, you can also use typeid(variable) == typeid(B) if you don't want to compare arbitrary strings. (better code style) There are also libraries to help you do this sort of runtime reflection like witchcraft: https://code.dlang.org/packages/witchcraft or a more current hunt fork, though I don't know yet what it changes: https://github.com/huntlabs/hunt-reflection
Mar 30 2020