/*
$ tks class_virtualdispatch_network2.tks
-----------------------------------
class = Layer
Layer::consumeAction
Layer::consumeAction

-----------------------------------
class = TableCellEditor
Layer::consumeAction
Layer::consumeAction
Layer::consumeAction
  as Layer:
Layer::consumeAction
Layer::consumeAction

-----------------------------------
class = FloatParamEditor
FloatParamEditor::consumeAction
FloatParamEditor::consumeAction
FloatParamEditor::consumeAction
  as Layer:
FloatParamEditor::consumeAction
FloatParamEditor::consumeAction

-----------------------------------
class = TableCellEditorFloatParam
FloatParamEditor::consumeAction
FloatParamEditor::consumeAction
FloatParamEditor::consumeAction
FloatParamEditor::consumeAction
  as Layer:
FloatParamEditor::consumeAction
FloatParamEditor::consumeAction
  as TableCellEditor:
FloatParamEditor::consumeAction
FloatParamEditor::consumeAction
FloatParamEditor::consumeAction
  as FloatParamEditor:
FloatParamEditor::consumeAction
FloatParamEditor::consumeAction
FloatParamEditor::consumeAction

*/

module Main;

class Layer {
   public method consumeAction() {
      trace "Layer::consumeAction";
   }
   x() { consumeAction(); }
}

class TableCellEditor : Layer {
   y() { consumeAction(); }
}

class FloatParamEditor : Layer {
   public virtual consumeAction() {
      trace "FloatParamEditor::consumeAction";
   }
   z() { consumeAction(); }
}

class TableCellEditorFloatParam : TableCellEditor, FloatParamEditor {

   w() { consumeAction(); }
}

trace "-----------------------------------";
trace "class = Layer";
Layer l;
l.consumeAction();
l.x();
trace "\n";


trace "-----------------------------------";
trace "class = TableCellEditor";
TableCellEditor tce;
tce.consumeAction();
tce.x();
tce.y();
trace "  as Layer:";
l <= tce;
l.consumeAction();
l.x();
trace "\n";


trace "-----------------------------------";
trace "class = FloatParamEditor";
FloatParamEditor fpe;
fpe.consumeAction();
fpe.x();
fpe.z();
trace "  as Layer:";
l <= fpe;
l.consumeAction();
l.x();
trace "\n";


trace "-----------------------------------";
trace "class = TableCellEditorFloatParam";
TableCellEditorFloatParam tcefp;
tcefp.consumeAction();
tcefp.x();
tcefp.y();
tcefp.z();
trace "  as Layer:";
l <= tcefp;
l.consumeAction();
l.x();
trace "  as TableCellEditor:";
tce <= tcefp;
tce.consumeAction();
tce.x();
tce.y();
trace "  as FloatParamEditor:";
fpe <= tcefp;
fpe.consumeAction();
fpe.x();
fpe.z();