parent class get the subclass object

Nemanja Boric via Digitalmars-d digitalmars-d at puremagic.com
Mon Jan 16 08:47:09 PST 2017


On Monday, 16 January 2017 at 16:31:41 UTC, Brian wrote:
> On Monday, 16 January 2017 at 12:20:47 UTC, rikki cattermole 
> wrote:
>> On 17/01/2017 1:15 AM, Brian wrote:
>>> Dlang should support such coding. What should I do?
>>>
>>> import std.stdio : writeln;
>>>
>>> abstract class Base(T)
>>> {
>>>     this()
>>>     {
>>>         _this = this;
>>>     }
>>>
>>>     void hello()
>>>     {
>>>         _this.world();
>>>     }
>>>
>>>     private
>>>     {
>>>         T _this;
>>>     }
>>> }
>>>
>>>
>>> class Sub : Base!Sub
>>> {
>>>     void world()
>>>     {
>>>         writeln("Hello world");
>>>     }
>>> }
>>>
>>> void main()
>>> {
>>>     Sub sub = new Sub;
>>>     sub.hello();
>>> }
>>>
>>
>> FYI, this would have been more appropriate in D.learn instead 
>> of the main forum.
>>
>> import std.stdio;
>>
>> abstract class Base {
>> 	void hello() {
>> 		world();
>> 	}
>>
>> 	void world();
>> }
>>
>> class Sub : Base {
>> 	override void world() {
>> 		writeln("Hello World");
>> 	}
>> }
>>
>> void main() {
>> 	Sub sub = new Sub;
>> 	sub.hello();
>> }
>
> No, you don't understand I want to express meaning.
>
> other programing language is allow this.
>
> Your code more like the old C++.
>
> If a high-level programing language or need haevy like C++ impl 
> code, It's very regret.
>
> Can like rust / swift / php / java / C# ?

You're missing a cast, since `this` is a reference to a 
superclass.

import std.stdio : writeln;

abstract class Base(T)
{
     this()
     {
         _this = cast(T)(this);
         assert(_this);
     }

     void hello()
     {
         _this.world();
     }

     private
     {
         T _this;
     }
}


class Sub : Base!Sub
{
     void world()
     {
         writeln("Hello world");
     }
}

void main()
{
     Sub sub = new Sub;
     sub.hello();
}



More information about the Digitalmars-d mailing list