On Sunday, 14 October 2018 at 13:21:00 UTC, Heromyth wrote:
Here is a sample code

```d
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);
        // }
}

void main()
{
        ThreadPoolExecutor service = new ThreadPoolExecutor();
        ExecutorService serviceBase = service;
        IExecutorService serviceInterface = service;

        Future!(int) f = service.submit!int(12);
        writeln(f.result);
        
        f = serviceBase.submit!int(12);
        writeln(f.result);

        // f = serviceInterface.submit!int(12);
        // writeln(f.result);
}

```

The **submit** can't be defined in D as done in Java. See also (search for exchangeMessageVectorsAsync):

https://www.programcreek.com/java-api-examples/?code=aarmea/noise/noise-master/app/src/main/java/com/alternativeinfrastructures/noise/sync/StreamSync.java

So, is there a better way to do this in D?
Any suggestions are welcome.
Thanks.

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:

import std.stdio;

class Future(T)
{
        T result;

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

interface IExecutorService(Ts...) {
        static foreach(T; Ts)
                Future!T submit(T result);
}

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

class ThreadPoolExecutor : ExecutorService!int {
         override Future!int submit(int result) {
                return new Future!int(result + 10);
         }
}

void main()
{
        ThreadPoolExecutor service = new ThreadPoolExecutor();
        ExecutorService!int serviceBase = service;
        IExecutorService!int serviceInterface = service;

        Future!(int) f = service.submit(12);
        writeln(f.result);

        f = serviceBase.submit(12);
        writeln(f.result);

        f = serviceInterface.submit(12);
        writeln(f.result);
}

so that you can submit and have Future for several types.

Reply via email to