Template functions inside interface

Steven Schveighoffer schveiguy at gmail.com
Tue Aug 4 15:14:21 UTC 2020


On 8/4/20 9:39 AM, Adam D. Ruppe wrote:
> On Tuesday, 4 August 2020 at 13:36:15 UTC, Zans wrote:
>> Is there any way to declare template functions inside interface and 
>> then override them in a class?
> 
> No, the templates in the interface are automatically considered `final`. 
> So the body must be in the interface too to avoid that undefined 
> reference error.
> 
> You can have them forward to normal methods in the interface though, 
> just there needs to be a fixed number of them with concrete types.

I was kind of surprised the compiler didn't complain about override 
there. Is override ever a valid attribute for a template function? Is 
there a reason we ignore it for templates?

I can imagine a lot of confusion for something like:

import std.stdio;

interface MyInterface
{
     T doAndReturnSomething(T)(T param){return T.init;}
}

class MyClass : MyInterface
{
     override T doAndReturnSomething(T)(T param)
     {
         return param;
     }
}

void main()
{
     MyInterface myClass = new MyClass();
     writeln(myClass.doAndReturnSomething("Hello"));
}

Which compiles, runs, and prints nothing.

-Steve


More information about the Digitalmars-d-learn mailing list