/**
* This example is adapted from an example in:
*
* J. Eifrig, S. Smith, V. Trifonov,
* Sound Polymorphic Type Inference for Objects, OOPSLA 1995, pp. 169-184.
*
* http://www.cs.jhu.edu/labs/pll/constraints/#7
*/
interface Operation
{
void apply(View v);
}
class View
{
View dep;
public void doall(Operation f) {
f.apply(this);
if (dep != null)
dep.doall(f);
}
public void setDep(View v) {
dep = v;
}
}
class GView extends View
{
public void draw() {
// ...
}
}
class DrawOperation implements Operation
{
public void apply(View v) {
((GView)v).draw();
}
}
class OPSLA95
{
public static void main(String[] args) {
View v1 = new View();
View g1 = new GView();
View g2 = new GView();
View g3 = new GView();
g1.setDep(v1);
g2.setDep(g3);
g2.doall(new DrawOperation());
}
}