Suponha que você tenha o seguinte:
+--------+ +------+
| Animal | | Food |
+-+------+ +----+-+
^ ^
| |
| |
+------+ +-------+
| Deer | | Grass |
+------+ +-------+
Deer
herda de Animal
e Grass
herda de Food
.
Por enquanto, tudo bem. Animal
objetos podem comer Food
objetos.
Agora vamos misturar um pouco. Vamos adicionar um Lion
que herda de Animal
.
+--------+ +------+
| Animal | | Food |
+-+-----++ +----+-+
^ ^ ^
| | |
| | |
+------+ +------+ +-------+
| Deer | | Lion | | Grass |
+------+ +------+ +-------+
Agora temos um problema porque Lion
podemos comer os dois Deer
e Grass
, mas Deer
nã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.