digitalmars.D.learn - howto dispatch to derived classes?
- Manfred Nowak (4/18) Oct 14 2013 -manfred
- =?UTF-8?B?QWxpIMOHZWhyZWxp?= (26/43) Oct 14 2013 That it not exactly the same but looks like the visitor pattern. The
- Manfred Nowak (13/16) Oct 14 2013 This would require changes in the whole class hierarchy.
class C{} class C1:C{} // ... class Cn:C{} C getC(){ return new Cn;} // might be extern // and deliver some Ci void visit( C1 fp){} // ... void visit( Cn fp){} void main(){ visit( getC); // dispatch? }-manfred visit( getC); }
Oct 14 2013
On 10/14/2013 02:09 PM, Manfred Nowak wrote:That it not exactly the same but looks like the visitor pattern. The actual type of the object is implicitly stored in the vtbl of each type. So, a virtual function like accept() can do the trick: import std.stdio; class C{ abstract void accept(); } class C1:C { override void accept() { visit(this); } } class Cn:C{ override void accept() { visit(this); } } C getC(){ return new Cn;} // might be extern // and deliver some Ci void visit( C1 fp) { writeln("visiting C1"); } void visit( Cn fp){ writeln("visiting Cn"); } void main(){ getC().accept(); } Aliclass C{} class C1:C{} // ... class Cn:C{} C getC(){ return new Cn;} // might be extern // and deliver some Ci void visit( C1 fp){} // ... void visit( Cn fp){} void main(){ visit( getC); // dispatch? }-manfred visit( getC); }
Oct 14 2013
=?UTF-8?B?QWxpIMOHZWhyZWxp?= wrote:a virtual function like accept() can do the trickThis would require changes in the whole class hierarchy. But because ofThe actual type of the object is implicitly stored in the vtbl of each type.and in addition, because the statement | writeln( getC.classinfo.create.classinfo); gives the correct type there should be a possibility to dispatch to the correct `visit' function without any changes in the class hierarchy. I see that a sequence of statements | if( auto tmp= cast(Ci) getC) visit( tmp); can dispatch to the correct `visit' function. But this again would require knowledge of all `Ci'. A solution seems very close, but ... -manfred
Oct 14 2013