Cumulative
Tofu Ninja
emmons0 at purdue.edu
Mon Feb 24 16:55:53 PST 2014
On Tuesday, 25 February 2014 at 00:18:47 UTC, Namespace wrote:
> Maybe:
> ----
> extend void foo() { ... }
> ----
> would force you to use super.foo() and otherwise gives an error?
>
> ----
> class Foo {
> void foo() {
> // ...
> }
> }
>
> class Bar : Foo {
> extend void foo() {
> // compiler will force you (opposed to override) that
> you call super.foo() but it isn't important where. You can call
> it at the end or at the start or wherever you wish.
>
> }
> }
> ----
>
> Maybe we could also reduce the super.FUNCTION with "super" as
> for base class constructors. Or to distinguish we could name it
> "base":
>
> ----
> class Foo {
> void foo() {
> // ...
> }
> }
>
> class Bar : Foo {
> extend void foo() {
> base(); /// will be rewritten to super.foo();
> }
> }
> ----
>
> The latter is of course for the "lazy" people. :)
This is not good enough, this makes the "extend" optional on
overridden functions. What it needs to be is a way to ensure that
if your function is overridden by a base class that it is
guaranteed to be called by the new function.
Something like this
class A
{
extendable void foo(){}
}
class B : A
{
override void foo(){}// compilation error, super.foo not
called
}
This makes it non-optional. You have to call super.foo if you
want to override foo.
Also, in some cases it is not enough just to ensure that it is
called, some times you will want to make sure that it is called
at the beginning or end of the function. Though this is harder to
get right, not really sure how it would work with returns.
Also I think it would make sense for something like this to be
transitive. For instance in the above example, the new foo should
also be extendable or else the guarantee breaks.
More information about the Digitalmars-d
mailing list