Please be more careful when changing the language behavior

jmh530 john.michael.hall at gmail.com
Wed Jun 3 19:40:10 UTC 2020


On Tuesday, 2 June 2020 at 06:17:50 UTC, mw wrote:
> [snip]

Thanks for that some interesting materials there about Eiffel.

As it says on the wikipedia page, the select & rename together 
drives their solution. Combining select and rename in one class 
is like an alias in D. However, D does not have the ability to 
prevent calling a member function of an inherited class. Using 
opDispatch doesn't work because it comes after calling member 
functions.

I think the most D-like way to incorporate this behavior is to 
allow @disable in a derived class for a base member function. 
Right now (see code below), you get a message about a 
depreciation (I think this one [1]) and not being able to 
@disable an overridden (you have to throw in an override) base 
class member function.

Probably would require a DIP, there is likely code out there that 
depends on always being able to call the base class member 
functions. Ideally, it would also handle base members, but this 
would likely require an even bigger change.

[1] 
https://dlang.org/deprecate.html#Overriding%20without%20override


import std.stdio: writeln;

class A
{
     int x;
     void foo(int x){
     	writeln("A");
     }
}

class B : A
{
     alias val = A.foo;

     //@disable this.x;
     @disable override void foo(int){}
}

void main() {
     A a = new A;
     B b = new B;
     b.val(1);
}




More information about the Digitalmars-d mailing list