scoped classes and dependency inversion

Neia Neutuladh neia at ikeran.org
Thu Nov 8 16:31:26 UTC 2018


On Thu, 08 Nov 2018 11:04:19 +0000, Sjoerd Nijboer wrote:
> I'm trying to invert the dependency from the classes `Bar -> Foo` to
> `Foo -> IFoo <- Bar` at compile time.
> 
> I do want `Foo's` to be embedded into `Bar`

These goals are a *little* at odds with each other; having a scoped!Foo 
puts significant constraints on how to build the object. But you know your 
needs a lot better than some generic advice.

I believe what you need to do is pass a factory function into the 
constructor. This is a bit awkward.

The really annoying part is that std.typecons doesn't have a named type 
for the scoped wrapper for a type. It's actively hostile to having scoped 
fields for no discernable reason. Filed https://issues.dlang.org/
show_bug.cgi?id=19379

Anyway, here's some code to make it work. It's kind of ugly.

---
import std.stdio;
import std.typecons;

void main()
{
	auto bar = new Bar!Foo((ref f) { f = scoped!Foo(); });
}

class Bar(TFoo) if(is(TFoo : IFoo))
{
	alias SFoo = typeof(scoped!TFoo());
	SFoo _foo;
	this(void delegate(ref SFoo) dg)
	{
		dg(_foo);
	}
}

class Foo : IFoo
{
	void baz(){}
}

interface IFoo
{
	void baz();
}
---


More information about the Digitalmars-d-learn mailing list