Я бы предложил что-то вроде следующего.
package Animals is
type Animal_Sound is (Default, None, Woof, Yelp, Howl, Meow, Oink);
type Animal is abstract tagged
record
Special_Sound: Animal_Sound := Default;
end record;
function Default_Sound (Creature: in Animal) return Animal_Sound is abstract;
function Sound (Creature: in Animal'Class) return Animal_Sound;
end;
package body Animals is
function Sound (Creature: in Animal'Class) return Animal_Sound is
begin
if Creature.Special_Sound /= Default then
return Creature.Special_Sound;
else
return Default_Sound (Creature);
end if;
end;
end Animals;
Тогда вы можете добавить собаку следующим образом.
with Animals; use Animals;
package Canine is
type Puppy_Count is range 0 .. 24;
type Dog is new Animal with
record
Litter_Size: Puppy_Count := 0;
end record;
overriding
function Default_Sound (Pooch: in Dog) return Animal_Sound is (Woof);
end;
Идея состоит в том, что животное определенного класса имеетзвук по умолчанию, но он может иметь специальный звук.У нас есть специальное значение Default
, равное Animal_Sound
, которое указывает, что звук животного является звуком по умолчанию.Мы определяем абстрактную функцию Default_Sound
, которая должна быть переопределена каждым классом животных, и вспомогательную функцию Sound
, которая возвращает звук по умолчанию или специальный звук в зависимости от ситуации.