On Thursday, 16 January 2014 at 09:28:18 UTC, Boyd wrote:
For extending, there is the 'protected' attribute, but it's specific for class overriding only. Very often, extensions are not merely limited to derived classes. What I find myself wanting is more like the 'package' attribute, except it needs to work outside of the package as well.
You can make class members accessible to a module by reintroducing them in a derived class using an alias. It even works for static and final methods, and field variables. Example:
/////////////////////////////////////////////////////////// module library; class Button { protected void click() {} } /////////////////////////////////////////////////////////// module user; import library; void main() { auto button = new Button(); button.click(); // NG } /////////////////////////////////////////////////////////// module extender; import library; class ExtendedButton : Button { // reintroduce protected member as private to this scope private alias Button.click click; } void main() { auto button = new ExtendedButton(); button.click(); // OK } /////////////////////////////////////////////////////////// HTH.