Re: How do you return a subclass instance from a base class method?
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?
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).