If class M stores or manipulates or in any other way works with instances of destructible (disposable) class D, it may not assume the responsibility to destruct these instances, unless it is explicitly told that ownership of these instances is transferred to it. Therefore, class M must accept a boolean called 'handoff' as a construction-time parameter, stating whether instances of D are being handed off to it, and it can therefore destruct them when it is done with them.
Example:
//Note: the IReader interface extends IDisposable IReader reader = new BinaryStreamReader( ... ); reader = new BufferedStreamReader( reader, handoff:true ); try { /* use the reader interface */ } finally { reader.Dispose(); //this destructs the buffered stream reader, and //destruction cascades to the binary stream //reader because handoff was specified. }
Example:
var collection = new CollectionOfDestructibles( handoff:true ); collection.Add( new Destructible( 1 ) ); collection.Add( new Destructible( 2 ) ); collection.Add( new Destructible( 3 ) ); collection.Dispose(); //this destructs the collection and every single //one of its contents, since handoff was specified.
In languages which support optional parameters, the 'handoff' parameter should default to false.