"External interfaces" or "Interface maps"
Michel Fortin
michel.fortin at michelf.com
Sat Oct 18 05:13:32 PDT 2008
This reminds me of an old proposal of mine (to which no one replied).
<http://digitalmars.com/d/archives/digitalmars/D/Idea_Class_extension_as_an_interface_73127.html>
Quoting
myself:
> I'd like to propose a class extension that allows overriding members.
> What I'm proposing is that:
>
> 1. you can create a class extension for a given class you want to
> extend, such an extension
> containing member function definitions which would become available
> to any user of that
> class if he has included the extension's module;
> 2. functions definitions in the class extension can only access the
> public-accessible members
> of the extended class, package-accessible members if they're in the
> same package, or
> private-accessible memebers if they're in the same module;
> 3. extensions implicitly create an interface which can be reimplemented
> in a derivative of
> the extended class if the need arise to override some of the
> extension functions.
>
> Calling a non-final extension method would enquire the following
> process: check if the class implements the given extension interface;
> if it does: call from there; if it does not: call the base extension
> method. Making an extension method final means that the function cannot
> be reimplemented by subclasses, allowing us to bypass this process.
>
> Here's a simple example:
>
> ~~~~~~
> class A {
> string exp;
> string toExpression() { return exp; }
> }
>
> // Extension interface for A, providing functions to be used with any A
> descendent
> extension Ext : A {
> string toQuotedExpression() { return quote(toExpression()); }
> }
>
> // Class B derives from A and reimplements Ext more efficiently.
> class B : A, Ext {
> string quotedExp;
> override string toQuotedExpression() { return quotedExp; }
> }
> ~~~~~~
>
> This way, A's implemententor doesn't need to know about any extension
> interfaces applying to A, and A's subclasser can still override any
> extension he wishes, if he has access to it and it makes sense.
>
> Perhaps such extensions could also be defined for structs, typedefs or
> primitive types. In those cases however, functions cannot be overriden.
--
Michel Fortin
michel.fortin at michelf.com
http://michelf.com/
More information about the Digitalmars-d
mailing list