Thread overview
Is it possible to return the subclass from a method of the parent class in dlang?
Mar 02, 2018
Christian Köstlin
Mar 03, 2018
Christian Köstlin
Mar 03, 2018
Christian Köstlin
Mar 03, 2018
H. S. Teoh
Mar 06, 2018
Jacob Carlborg
March 02, 2018
To give an example:

class Thread {
  ...
  Thread start() {...}
}

class Timer : Thread {
  ...
}


void main() {
  // Timer timer = new Timer().start;  // this does not work
  auto timer = new Timer().start; // because timer is of type Thread
}


thanks in advance,
christian

March 02, 2018
On 3/2/18 3:23 PM, Christian Köstlin wrote:
> To give an example:
> 
> class Thread {
>    ...
>    Thread start() {...}
> }
> 
> class Timer : Thread {
>    ...
> }
> 
> 
> void main() {
>    // Timer timer = new Timer().start;  // this does not work
>    auto timer = new Timer().start; // because timer is of type Thread
> }

Yes:

class Timer : Thread {
   override Timer start() { ... }
}

https://dlang.org/spec/function.html#virtual-functions

(see item 6)

-Steve
March 03, 2018
On 02.03.18 21:39, Steven Schveighoffer wrote:
> On 3/2/18 3:23 PM, Christian Köstlin wrote:
>> To give an example:
>>
>> class Thread {
>>    ...
>>    Thread start() {...}
>> }
>>
>> class Timer : Thread {
>>    ...
>> }
>>
>>
>> void main() {
>>    // Timer timer = new Timer().start;  // this does not work
>>    auto timer = new Timer().start; // because timer is of type Thread
>> }
> 
> Yes:
> 
> class Timer : Thread {
>    override Timer start() { ... }
> }
> 
> https://dlang.org/spec/function.html#virtual-functions
> 
> (see item 6)
> 
> -Steve
Thanks for this.
It works for me only without the override (with override I get
Error: function timer.Timer.start does not override any function, did
you mean to override 'core.thread.Thread.start'?).

Although I wonder if its possible to "fix" this in the Thread class with
some dlang magic. e.g. traits
class Thread {
  traits(GetClass) start() {...}
}

or perhaps

class ThreadHelper(T) : Thread {
  override T start() {return cast(T)super.start();}
}
class Timer : Thread!Timer {
}
March 03, 2018
>> class Timer : Thread {
>>    override Timer start() { ... }
>> }
>>
>> https://dlang.org/spec/function.html#virtual-functions
>>
>> (see item 6)
>>
>> -Steve
> Thanks for this.
> It works for me only without the override (with override I get
> Error: function timer.Timer.start does not override any function, did
> you mean to override 'core.thread.Thread.start'?).
This seems to be connected to Thread.start being a final function.

March 02, 2018
On Sat, Mar 03, 2018 at 01:13:43AM +0100, Christian Köstlin via Digitalmars-d-learn wrote:
> >> class Timer : Thread {
> >>    override Timer start() { ... }
> >> }
> >>
> >> https://dlang.org/spec/function.html#virtual-functions
> >>
> >> (see item 6)
> >>
> >> -Steve
> > Thanks for this.
> > It works for me only without the override (with override I get
> > Error: function timer.Timer.start does not override any function,
> > did you mean to override 'core.thread.Thread.start'?).
>
> This seems to be connected to Thread.start being a final function.

Well, yes, you cannot override a final function.  That is the point of `final`. :-D

If you meant to override it after all, remove the `final`.


T

-- 
Life is complex. It consists of real and imaginary parts. -- YHL
March 06, 2018
On 2018-03-02 21:23, Christian Köstlin wrote:
> To give an example:
>
> class Thread {
>    ...
>    Thread start() {...}
> }
>
> class Timer : Thread {
>    ...
> }
>
>
> void main() {
>    // Timer timer = new Timer().start;  // this does not work
>    auto timer = new Timer().start; // because timer is of type Thread
> }

You can also try a template this parameter [1] in the base class:

class Thread
{
    T start(this T) () { ... }
}

But if this "Thread" is core.thread.Thread that won't work.

[1] https://dlang.org/spec/template.html#template_this_parameter

-- 
/Jacob Carlborg