Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
March 02, 2018 Is it possible to return the subclass from a method of the parent class in dlang? | ||||
---|---|---|---|---|
| ||||
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 Re: Is it possible to return the subclass from a method of the parent class in dlang? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Christian Köstlin | 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 Re: Is it possible to return the subclass from a method of the parent class in dlang? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | 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 Re: Is it possible to return the subclass from a method of the parent class in dlang? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Christian Köstlin | >> 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 Re: Is it possible to return the subclass from a method of the parent class in dlang? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Christian Köstlin | 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 Re: Is it possible to return the subclass from a method of the parent class in dlang? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Christian Köstlin | 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 |
Copyright © 1999-2021 by the D Language Foundation