Defining and overriding methods of an abstract base class which must accept a template parameter

Basile B. via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Jul 10 14:20:34 PDT 2016


On Sunday, 10 July 2016 at 21:06:42 UTC, pineapple wrote:
> This is essentially what I'm trying to accomplish. The 
> intuitive solution, of course, does not work. In theory I could 
> write a separate method for every anticipated return type, but 
> that would be horrible and in that case I'd probably just write 
> the damn thing in a dynamically-typed language instead.
>
>     import std.conv;
>
>     abstract class BaseClass{
>         abstract X convertSomePropertyTo(X)();
>     }
>
>     class SubClass(T): BaseClass{
>         T property;
>         X convertSomePropertyTo(X)(){
>             return property.to!X;
>         }
>     }
>
>     void main(){
>         BaseClass obj = new SubClass!int;
>         auto x = obj.convertSomePropertyTo!real; // Error: 
> function 
> test.BaseClass.convertSomePropertyTo!real.convertSomePropertyTo 
> non-virtual functions cannot be abstract
>     }

The problem you encounter here is that templatized functions 
cannot be virtual. If you remove "abstract" and put an empty body 
than it works, but you lose the whole OOP thing, i.e you cannot 
call the most derived override from the base.

====
import std.conv;

abstract class BaseClass
{
     auto convertSomePropertyTo(X)(){};
}

class SubClass(T): BaseClass
{
     T property;
     X convertSomePropertyTo(X)()
     {
         return property.to!X;
     }
}

void main()
{
     SubClass!int obj = new SubClass!int;
     auto x = obj.convertSomePropertyTo!real;
}
===

We are many to encounter this issue. It comes from the fact that 
the VTBL cannot be build from a template.


More information about the Digitalmars-d-learn mailing list