Предположим, у вас есть следующее:
+--------+ +------+
| Animal | | Food |
+-+------+ +----+-+
^ ^
| |
| |
+------+ +-------+
| Deer | | Grass |
+------+ +-------+
Deerнаследует от Animalи Grassнаследует от Food.
Все идет нормально. Animalобъекты могут есть Foodобъекты.
Теперь давайте немного перемешаем. Давайте добавим, Lionкоторый наследуется от Animal.
+--------+ +------+
| Animal | | Food |
+-+-----++ +----+-+
^ ^ ^
| | |
| | |
+------+ +------+ +-------+
| Deer | | Lion | | Grass |
+------+ +------+ +-------+
Теперь у нас есть проблема, потому что Lionможет есть и то, Deerи другое Grass, но Deerэто не Foodтак Animal.
Как решить эту проблему без использования множественного наследования и объектно-ориентированного проектирования?
К вашему сведению: я использовал http://www.asciiflow.com для создания диаграмм ASCII.
IHuntable, Овцы и Коровы IHerdable(управляются человеком), а Лион реализует только IAnimal, что не подразумевает какой-либо из этих интерфейсов. AOE3 поддерживает запрос набора интерфейсов, поддерживаемых конкретным объектом (аналогично instanceof), что позволяет программе запрашивать его возможности.