digitalmars.D - Implement disable methods as always-throw methods?
- Andrej Mitrovic <andrej.mitrovich gmail.com> Oct 02 2011
- Timon Gehr <timon.gehr gmx.ch> Oct 02 2011
- Walter Bright <newshound2 digitalmars.com> Oct 02 2011
- Timon Gehr <timon.gehr gmx.ch> Oct 02 2011
- Walter Bright <newshound2 digitalmars.com> Oct 02 2011
- "Jonathan M Davis" <jmdavisProg gmx.com> Oct 02 2011
I'm curious about this case:
import std.stdio;
abstract class Widget
{
void add(Widget w) { writeln("add"); }
void remove(Widget w) { writeln("remove"); }
}
class Leaf : Widget
{
disable override void add(Widget Widget) { writeln("disabled"); }
disable override void remove(Widget Widget) { writeln("disabled"); }
}
void main()
{
Widget leaf = new Leaf;
leaf.add(new Leaf);
}
The compiler can't catch this since 'leaf' has the static type Widget,
so Leaf's virtual function will still get called. Of course you could
cast leaf to Leaf, but that's beside the point that a disabled method
ultimately gets called.
I was thinking, would it be a good idea for the compiler to implement
disabled methods as always-throw methods? If it can't catch them being
called at compile time then at least you would get a runtime error if
they were to throw.
Thoughts?
Oct 02 2011
On 10/02/2011 07:41 PM, Andrej Mitrovic wrote:I'm curious about this case: import std.stdio; abstract class Widget { void add(Widget w) { writeln("add"); } void remove(Widget w) { writeln("remove"); } } class Leaf : Widget { disable override void add(Widget Widget) { writeln("disabled"); } disable override void remove(Widget Widget) { writeln("disabled"); } } void main() { Widget leaf = new Leaf; leaf.add(new Leaf); } The compiler can't catch this since 'leaf' has the static type Widget, so Leaf's virtual function will still get called. Of course you could cast leaf to Leaf, but that's beside the point that a disabled method ultimately gets called. I was thinking, would it be a good idea for the compiler to implement disabled methods as always-throw methods? If it can't catch them being called at compile time then at least you would get a runtime error if they were to throw. Thoughts?
Imho disabling overriden member functions is unsound and should be disallowed entirely.
Oct 02 2011
On 10/2/2011 10:59 AM, Timon Gehr wrote:Imho disabling overriden member functions is unsound and should be disallowed entirely.
I agree, as disabling an override doesn't make any sense. If the user wants an exception thrown if the overriding function is called, he can add a 'throw' in it himself. How about filing a bugzilla for this?
Oct 02 2011
On 10/02/2011 10:05 PM, Walter Bright wrote:On 10/2/2011 10:59 AM, Timon Gehr wrote:Imho disabling overriden member functions is unsound and should be disallowed entirely.
I agree, as disabling an override doesn't make any sense. If the user wants an exception thrown if the overriding function is called, he can add a 'throw' in it himself. How about filing a bugzilla for this?
Done: http://d.puremagic.com/issues/show_bug.cgi?id=6760
Oct 02 2011
On 10/2/2011 1:34 PM, Timon Gehr wrote:Done: http://d.puremagic.com/issues/show_bug.cgi?id=6760
Tanks!
Oct 02 2011
On Sunday, October 02, 2011 19:59:01 Timon Gehr wrote:Imho disabling overriden member functions is unsound and should be disallowed entirely.
Agreed. It goes against the basic principles of OO design. A derived class _is_ an instance of its base class, and it should be possible to treat it as its base class. Disabling overridden functions goes completely against that and therefore seems like a _really_ bad design. - Jonathan M Davis
Oct 02 2011









Walter Bright <newshound2 digitalmars.com> 