digitalmars.D - Implement disable methods as always-throw methods?
- Andrej Mitrovic (26/26) Oct 02 2011 I'm curious about this case:
- Timon Gehr (3/29) Oct 02 2011 Imho disabling overriden member functions is unsound and should be
- Walter Bright (5/7) Oct 02 2011 I agree, as disabling an override doesn't make any sense. If the user wa...
- Timon Gehr (2/10) Oct 02 2011 Done: http://d.puremagic.com/issues/show_bug.cgi?id=6760
- Walter Bright (2/3) Oct 02 2011 Tanks!
- Jonathan M Davis (6/8) Oct 02 2011 Agreed. It goes against the basic principles of OO design. A derived cla...
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:Done: http://d.puremagic.com/issues/show_bug.cgi?id=6760Imho 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/2/2011 1:34 PM, Timon Gehr wrote:Done: http://d.puremagic.com/issues/show_bug.cgi?id=6760Tanks!
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