Вы можете использовать виртуальную рассылку:
abstract class GameObject
{
abstract bool CheckCollision (GameObject other);
abstract bool CheckCollision (Sphere other);
abstract bool CheckCollision (Cube other);
abstract bool CheckCollision (Plane other);
}
class Sphere : GameObject
{
override bool CheckCollision (GameObject other) { return other.CheckCollision(this); }
override bool CheckCollision (Sphere other) { /* ... implementation ... */ }
override bool CheckCollision (Cube other) { /* ... implementation ... */ }
override bool CheckCollision (Plane other) { /* ... implementation ... */ }
}
class Cube : GameObject
{
override bool CheckCollision (GameObject other) { return other.CheckCollision(this); }
override bool CheckCollision (Sphere other) { /* ... implementation ... */ }
override bool CheckCollision (Cube other) { /* ... implementation ... */ }
override bool CheckCollision (Plane other) { /* ... implementation ... */ }
}
class Plane : GameObject
{
override bool CheckCollision (GameObject other) { return other.CheckCollision(this); }
override bool CheckCollision (Sphere other) { /* ... implementation ... */ }
override bool CheckCollision (Cube other) { /* ... implementation ... */ }
override bool CheckCollision (Plane other) { /* ... implementation ... */ }
}
EDIT
Подумайте, что происходит, когда у вас есть это:
GameObject go1 = new Sphere();
GameObject go2 = new Cube();
bool collision = go1.CheckCollision(go2);
- Вызов передается абстрактному методу GameObject.CheckCollision (GameObject) на сфере.
- Виртуальная отправка означает, что мы идем в Sphere.CheckCollision (GameObject)
- Sphere.CheckCollision (GameObject) вызывает абстрактный метод GameObject.CheckCollision (Sphere) для куба.
- Виртуальная отправка означает, что мы идем в Cube.CheckCollision (Sphere)!
Следовательно, операторы проверки типа if
не нужны.
РЕДАКТИРОВАТЬ 2
См. Ответ Эрика Липперта по адресу https://stackoverflow.com/a/2367981/385844;. Первый вариант - шаблон посетителей - по сути является подходом, описанным выше. Другой ответ Эрика в https://stackoverflow.com/a/9069976/385844 также обсуждает эту проблему.