digitalmars.D.learn - Is it possible to return the subclass from a method of the parent
- =?UTF-8?Q?Christian_K=c3=b6stlin?= (14/14) Mar 02 2018 To give an example:
- Steven Schveighoffer (8/24) Mar 02 2018 Yes:
- =?UTF-8?Q?Christian_K=c3=b6stlin?= (16/45) Mar 02 2018 Thanks for this.
- =?UTF-8?Q?Christian_K=c3=b6stlin?= (1/14) Mar 02 2018 This seems to be connected to Thread.start being a final function.
- H. S. Teoh (7/21) Mar 02 2018 Well, yes, you cannot override a final function. That is the point of
- Jacob Carlborg (10/22) Mar 06 2018 You can also try a template this parameter [1] in the base class:
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
Mar 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
Mar 02 2018
On 02.03.18 21:39, Steven Schveighoffer wrote:On 3/2/18 3:23 PM, Christian Köstlin wrote: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 { }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
Mar 02 2018
This seems to be connected to Thread.start being a final function.class Timer : Thread { Â Â override Timer start() { ... } } https://dlang.org/spec/function.html#virtual-functions (see item 6) -SteveThanks 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'?).
Mar 02 2018
On Sat, Mar 03, 2018 at 01:13:43AM +0100, Christian Köstlin via Digitalmars-d-learn wrote: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. -- YHLThis seems to be connected to Thread.start being a final function.class Timer : Thread { override Timer start() { ... } } https://dlang.org/spec/function.html#virtual-functions (see item 6) -SteveThanks 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'?).
Mar 02 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
Mar 06 2018