On Wednesday, 10 August 2016 at 15:52:29 UTC, Lodovico Giaretta
wrote:
On Wednesday, 10 August 2016 at 15:48:10 UTC, Lodovico Giaretta
wrote:
On Wednesday, 10 August 2016 at 15:39:19 UTC, Arafel wrote:
Would it even make sense to "force" (deprecation warning) a
"final" keyword in any implicitly-final function (I wasn't
even aware of those, I have to admit)? It would make things
much clearer, like with "override"...
I read the spec again, and found out that it says interfaces
cannot contain templated functions... So either my
interpretation is the intended one and the spec is outdated,
or the spec is right and the compiler is bugged.
Anyway what I said about implicit final is true for classes. In
classes, I don't like the idea of having to put an explicit
final, but this is debatable. For interfaces, I'm ok with
forcing an explicit final attribute (but as I said the spec
does not allow templated functions in interfaces, even if the
compiler does).
I have to say that the fact that this compiles at all seems like
a bug to me according to [1], even more so that the method in A
is called:
---
import std.stdio;
public class A {
public void func(T)(T t) {
writeln("Within A");
}
}
public class B : A {
override public void func(T)(T t) {
writeln("Within B");
}
}
void main() {
A a = new B();
a.func(1);
}
---
https://dpaste.dzfl.pl/f3d5beff2e51
If the function is "final", even if implicitly so, the "override"
should fail according to the spec as I, and I guess 99% of the
people[2], understand it.
[1]: https://dlang.org/spec/function.html#virtual-functions
[2]: OK, technically not, since it just says that "Functions
marked as final may not be overridden in a derived class [...]"
and this function is not *marked* as final, but implicitly
final... still...