On Sunday, 14 October 2018 at 15:06:49 UTC, Basile B. wrote:

The basic problem you're faced to here is that D class / interface member functions that are templatized are never virtual. I'm not sure if i understand well the JAVA pattern you try to reproduce but since D interfaces can be templatized you can do something like this, using variadics:


That's a good try. I want to have a try with template mixin.

About Java's pattern, see also:
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html


The interface ExecutorService has many implements like AbstractExecutorService, ForkJoinPool, ScheduledThreadPoolExecutor, ThreadPoolExecutor etc.

The sample above is updated:

import std.stdio;

class Future(T)
{
        T result;

        this(T r) {
                this.result = r;
        }
}

interface IExecutorService {
        // Future!(T) submit(T)(T result);  // can't be implemented
}

abstract class ExecutorService : IExecutorService {
         Future!(T) submit(T)(T result) {
                return new Future!(T)(result);
        }
}

class ThreadPoolExecutor : ExecutorService {
        // alias submit = ExecutorService.submit;
        
        // override Future!(T) submit(T)(T result) { // can't override it
        //      return new Future!(T)(result + 10);
        // }
}

class ForkJoinPool : ExecutorService {
        // alias submit = ExecutorService.submit;
        
        // override Future!(T) submit(T)(T result) { // can't override it
        //      return new Future!(T)(result * 10);
        // }
}

void testBase(ExecutorService service) {

        writeln("testBase: ", typeid(service));
        
        Future!(int) f = service.submit!int(12);
        writeln(f.result);
}

void testInterface(IExecutorService service) {

        writeln("testInterface: ", typeid(service));
        writeln("testInterface: ", typeid(cast(Object)service));
        
        // Future!(int) f = service.submit!int(12);
        // writeln(f.result);
}

void main()
{
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor();
        ForkJoinPool forkJoinPool = new ForkJoinPool();

        testBase(threadPool);
        writeln();
        testBase(forkJoinPool);
        writeln("\n");
        testInterface(threadPool);
        writeln();
        testInterface(forkJoinPool);
}


Reply via email to