Child pages
  • under the hood of re-motion mixins -- the simplest case -- 'DessertTopping' uses 'FloorWaxMixin'
Skip to end of metadata
Go to start of metadata

Here is an UML diagram of "DessertTopping uses FloorWaxMixin; FloorWaxMixin implements IFloorWaxMixin". This is what re-motion mixins finds in the mixin configuration:

[ The sample is introduced in FIXME. ]

re-motion mixins derives a sub-class from the target class at run-time. That sub-class sports the members of the target class and all mixins that it uses. The sub-class implements the interfaces of all mixins. The member variable _mixin is a collection of all used mixins. (Since we have only one mixin class in the samples, it is consequently referenced by _mixin[0].) The mechanism discussed here is the same for "target class uses
mixin class" and "mixin class extends target class":

Under the hood, the new sub-class (actually named like DessertTopping_Mixed_FIXME) implements the mixin classes' members by delegating the actual work to the corresponding mixins in _mixin. SealFloor(), for example, is implemented like this:

public void SealFloor ()
{
    _mixin[0].SealFloor ();
}

As you can see, this simple case essentially works like the one discussed in the video Mixins for Java: mixing is constructed with composition and delegation. [ http://www.berniecode.com/writing/java-mixins/ ]

If a method in the mixin class overrides a target method, re-motion mixins simply generates an extra declaration/delegation. For example, the method TasteGood () in DessertTopping does not need any mention in the derived (mixed) class. It is simple inherited from DessertTopping. If TasteGood () were overridden by the FloorWaxMixin, the extra delegation would be generated into the derived class, just like any other method from the mixin class:

public void TasteGood ()
{
    _mixin[0].TasteGood ();
}

What if a target method overrides a mixin method?

As the wiki page re-motion mixins basics -- overriding target methods#target overrides mixin? explains, "target method overrides mixin method" requires that the mixin class is derived from the generic Mixin<TThis> type. The next wiki page FIXME will explain why this is so and how overriding mixin methods works.

  • No labels