Я думаю, что вы можете делать то, что вы пытаетесь сделать, но не ТОЧНО, как вы думаете об этом.Ваш AnimalPool будет по существу «фабрикой» животных (посмотрите шаблон фабрики, это может помочь, но это не важная часть здесь.) И удвоится как коллекция «животных».Создайте объект «Животное», который имеет все методы и свойства, общие для всех животных.Затем сделайте нужных вам животных, таких как «Кошка» и «Собака», и выведите их из базового класса «Животное».Затем в «AnimalPool» добавьте функции для создания и возврата определенных типов Animal, таких как getDog () и getCat (), или создайте одну функцию с параметром.Создайте этот конкретный тип с помощью фабрики AnimalPool, и, поскольку он является производным от «Animal», вы можете добавить его в список типов «Animal».Когда вы извлечете животных из списка AnimalPool, вы сможете привести их к соответствующим типам.В зависимости от способностей отражения вашего языка, вы можете даже получить объект, чтобы сказать вам, какой это тип.
Это просто простой случай использования наследования и фабричного шаблона.Посмотри на эти две вещи, и я думаю, ты будешь на легкой улице с тем, чего ты пытаешься достичь.Удачи, и надеюсь, это поможет.Я могу дать вам пример кода, если вам это нужно.: -)