Re: How do you return a subclass instance from a base class method?

2022-11-17 Thread MorteFeuille123 via Digitalmars-d-learn
On Thursday, 17 November 2022 at 06:48:13 UTC, Daniel Donnelly, 
Jr. wrote:
On Thursday, 17 November 2022 at 05:21:05 UTC, MorteFeuille123 
wrote:
On Thursday, 17 November 2022 at 04:25:13 UTC, Daniel 
Donnelly, Jr. wrote:

[...]


You can use TypeInfoClass:

[...]


I don't get it - you never made use of b1 or b2...


yeah this was oversimplified on purpose, I did not realize that 
this coulmd be confusing. I dont know what you do with your 
constructor parameter either, would I say, as a second 
explanation.


Re: How do you return a subclass instance from a base class method?

2022-11-16 Thread MorteFeuille123 via Digitalmars-d-learn
On Thursday, 17 November 2022 at 04:25:13 UTC, Daniel Donnelly, 
Jr. wrote:
I have SubclassOf derived from PosetRelation.  For any poset 
relation, the transitivity law applies, however, I'd like to 
return the correct type:



How does one accomplish this in D?  Because PosetRelation 
doesn't know about SubclassOf, in general.


You can use TypeInfoClass:

```d
class Base
{
}

class Derived : Base
{
}

Object newDerivedFromTi(Base b)
{
return typeid(b).create();
}

void main(string[] args)
{
Base b = new Base;
Base d = new Derived;
assert(cast(Derived)newDerivedFromTi(d));
}
```

But that only works with default constructors, i.e no parameters.
Another way is to define a virtual function in the Base:

```d
class Base
{
Object createMostDerived(Base b1, Base b2)
{
return new typeof(this);
}
}

class Derived : Base
{
override Object createMostDerived(Base b1, Base b2)
{
return new typeof(this);
}
}

Object newDerivedFromTi(Base b)
{
return b.createMostDerived(b, b);
}

void main(string[] args)
{
Base b = new Base;
Base d = new Derived;
assert(cast(Derived)newDerivedFromTi(d));
}
```

assuming the PosetRelation (here called Base) actually cary the 
SubclassOf type (here called Derived).