そうだ、
派生クラスの合併集合のような基底クラスを作るための構文を用意すればいいんじゃないか?たとえばJavaで:
ambiguous class Animal {} // AnimalにはNotImplementExceptionを投げるだけのrun, fly, swimが暗黙に実装される
class Dog extends Animal {
public void run() {}
}
class ActiveDog extend Animal {
public void jump() {}
}
ambiguous class Bird extends Animal {
public void fly() {}
}
class Penguin extend Bird {
public void swim() {}
}
class Foo {
public static int f() {
Animal animal = new Dog();
animal.run(); // ok
animal.fly(); // 実行時エラー
animal.swim(); // 実行時エラー
animal.jump(); // コンパイル時エラー(Dogはambiguousではないので定義されていない)
animal = new Penguin();
animal.run(); // 実行時エラー
animal.fly(); // 実行時エラー
animal.swim(); // ok
animal.quack(); // コンパイル時エラー(定義されていない)
return 0;
}
}ambiguous修飾されたクラスでは、そのクラスから派生したクラス全てのpublic/protectedメソッドが、NotImplementExceptionを投げるだけの実装でコンパイラによって自動的に定義されます。また、ambiguous修飾により自動定義されたメソッドもpublic/protectedメソッドなので、もしこのクラスがambiguousで宣言された基底クラスを持っているのなら、そのクラスにも伝播します。
例では、Birdクラスがambiguousなので、PenguinクラスのメソッドswimがBirdクラスに定義されます。また、BirdはAnimalの派生クラスであり、Animalもambiguousなので、Animalにはrun, fly, swimが自動実装されます。