scoped classes and dependency inversion

Alex sascha.orlov at gmail.com
Thu Nov 8 15:41:40 UTC 2018


On Thursday, 8 November 2018 at 15:11:16 UTC, Sjoerd Nijboer 
wrote:
> Except if you want to pass a parameter to TFoo it'll become a 
> mess.
> And I expecially don't want it to become messy.

I thought of this case... But passing the argument to TFoo 
directly while constructing Bar is messier, I think. With the 
solution above you could just:

´´´
import std.stdio;
import std.typecons;

void main()
{
	auto initData = 42;
	auto bar = new Bar!Foo(initData);
	assert(bar._foo.orWhatTypeEver == initData);
}

class Bar(TFoo) if(is(TFoo : IFoo))
{
	typeof(scoped!TFoo()) _foo;
	this(T)(T fooParam) //if(__traits(compiles, new TFoo(T.init)))
	{
		_foo = scoped!TFoo(fooParam);
	}
}

class Foo : IFoo
{
	int orWhatTypeEver;
	this(T)(T myParam)
	{
		orWhatTypeEver = /*cast(int)*/myParam;
	}
	void baz(){}
}
interface IFoo{ void baz(); }
´´´

In this case, Bar's constructor is not bound to any special type 
of input, letting Foo handle any input you want. Still, the 
solution is type safe.

And, maybe to calm my mind: Bar is the context of Foo, so it is 
allowed to see its inputs...


More information about the Digitalmars-d-learn mailing list