I mostly come to prefer composition, this approach apparently even has a wiki page. But that's in part because I use Rust that forbids inheritance, and don't have such bullshit (from delegation wiki page):
class A { void foo() { // "this" also known under the names "current", "me" and "self" in other languages this.bar(); } void bar() { print("a.bar"); } } class B { private delegate A a; // delegation link public B(A a) { this.a = a; } void foo() { a.foo(); // call foo() on the a-instance } void bar() { print("b.bar"); } } a = new A(); b = new B(a); // establish delegation between two objects
Calling b.foo() will result in b.bar being printed, since this refers to the original receiver object, b, within the context of a. The resulting ambiguity of this is referred to as object schizophrenia
Translating the implicit this into an explicit parameter, the call (in B, with a a delegate) a.foo() translates to A.foo(b), using the type of a for method resolution, but the delegating object b for the this argument.
Why would one substitute b
as this
when called from b.a
is beyond me, seriously.
Depends on what was the course about. If it's about computation, then sure. If it's about OOP or architecture design (this one I wouldn't expect, unfortunately, but would be nice if it was taught somewhere), then the point is not just to run something.