Реализуйте класс приюта для животных (case class Shelter...
), который хранит список (List
)
животных, которые в нем содержатся. Приют должен быть параметризован типом содержащихся животных.
Например, Shelter[Cat]
может содержать только котов, а Shelter[Animal]
любых животных.
Реализуйте метод +
, который добавляет в приют животное (метод должен вернуть новый приют, а не модифицировать старый).
Тип полученного приюта должен остаться настолько точным, насколько это возможным.
Например, если в приют с котами добавляют кота, то в результате должен снова получиться приют с котами.
val s: Shelter[Cat] = Shelter(List(Cat("Garfield"))) + Cat("Kuzya")
Если же в приют с котами добавить собаку, то получится приют с животными.
val s: Shelter[Animal] = Shelter(List(Cat("Garfield"))) + Dog("Goofy")
Реализовать метод ++
, который производит сложение двух приютов и возвращает приют,
в котором содержатся животные из обоих, участвовавших в сложении.
Тип результата точно так же должен быть настолько точным, насколько это возможно, исходя из
типов приютов, участвовавших в сложении.
Реализовать метод getNames
, который возвращает спсок имен животных, содержащихся в приюте.
Тесты должны компилироваться и успешно проходить. Обратите внимание, что до вполнения второго
задания соответствующая часть тестов не будет компилироваться, так что ее можно закомментировать.
Реализовать тип еда (trait Food
), который параметризован типом животных, которые
ее могут есть. Например, Food[Cat]
могут есть только коты, а
Food[Animal]
могут есть любые животные. Реализовать объекты (case object
):
Meat
- мясо, могут есть все животные.
Milk
- молоко, могут есть коты.
Bread
- хлеб, могут есть собаки.
Определить для еды метод feed
, который принимает животное того типа, которым параметризована эта еда,
и возвращает строку, содержащую "<имя животного> eats <название еды со строчной буквы>". Например,
Meat.feed(Cat("Garfield"))
должно вернуть "Garfield eats meat", а Milk.feed(Dog("Goofy"))
не должно
компилироваться т.к. собаки не едят молоко.
Реализовать для приюта метод, который получает на вход еду, которая подходит для
содержащихся в нем животных, и выводит список результатов применеия метода Food.feed
ко
всем животным. Обратите внамение, что Shelter(List(Cat("Garfield"), Dog("Goofy"))).feed(Milk)
не должно
компилироваться т.к. в этом приюте содержатся и кошки и собаки,
следовательно тип этого приюта - Shelter[Animal]
, а произвольные животные не могут есть молоко. Единственная
еда, которой их можно было бы покормить - мясо.