Suponha que você tenha o seguinte:
+--------+ +------+
| Animal | | Food |
+-+------+ +----+-+
^ ^
| |
| |
+------+ +-------+
| Deer | | Grass |
+------+ +-------+
Deerherda de Animale Grassherda de Food.
Por enquanto, tudo bem. Animalobjetos podem comer Foodobjetos.
Agora vamos misturar um pouco. Vamos adicionar um Lionque herda de Animal.
+--------+ +------+
| Animal | | Food |
+-+-----++ +----+-+
^ ^ ^
| | |
| | |
+------+ +------+ +-------+
| Deer | | Lion | | Grass |
+------+ +------+ +-------+
Agora temos um problema porque Lionpodemos comer os dois Deere Grass, mas Deernão Foodé Animal.
Sem o uso de herança múltipla e o design orientado a objetos, como você resolve esse problema?
FYI: Usei http://www.asciiflow.com para criar os diagramas ASCII.
IHuntable, Sheep e Cow são IHerdable(controláveis por humanos), e o Lion implementa apenas o IAnimal, o que não implica em nenhuma dessas interfaces. O AOE3 suporta a consulta do conjunto de interfaces suportadas por um objeto específico (semelhante a instanceof) que permite que um programa consulte suas capacidades.