Interfaces and templates
Ali Çehreli
acehreli at yahoo.com
Fri Sep 20 19:51:23 UTC 2019
On 09/20/2019 12:02 PM, JN wrote:
> import std.stdio;
>
> interface IWriter
> {
> void write(U)(U x);
> }
>
> class Foo : IWriter
> {
> void write(U)(U x, int y)
> {
> writeln(x);
> }
> }
>
>
>
> void main()
> {
> }
>
> Does this code make sense?
No. Function templates cannot be virtual functions. There are at least
two reasons that I can think of:
1) Function templates are not functions but their templates; only their
instances would be functions
2) Related to that, languages like D that use virtual function pointer
tables for dynamic dispatch cannot know how large that table should be;
so, they cannot compile for an infinite number of entries in that table
> If so, why doesn't it throw an error about
> unimplemented write (or incorrectly implemented) method?
Foo.write hides IWriter.write (see "name hiding"). Name hiding is not an
error.
When you call write on the Foo interface it takes two parameters:
auto i = new Foo();
i.write(1, 2); // Compiles
When you call write on the IWriter interface it takes one parameter but
there is no definition for it so you get a linker error:
IWriter i = new Foo();
i.write(1); // LINKER ERROR
Ali
More information about the Digitalmars-d-learn
mailing list