Help about Template and class inheritance
    Heromyth 
    bitworld at qq.com
       
    Mon Oct 15 01:26:29 UTC 2018
    
    
  
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);
}
    
    
More information about the Digitalmars-d-learn
mailing list