Домашнее задание №5 (курс Scala, Naumen)
Задание 1
Реализуйте класс приюта для животных (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
, который возвращает спсок имен животных, содержащихся в приюте.
Тесты должны компилироваться и успешно проходить. Обратите внимание, что до вполнения второго
задания соответствующая часть тестов не будет компилироваться, так что ее можно закомментировать.
Задание 2
Реализовать тип еда (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]`, а произвольные животные не могут есть молоко. Единственная
еда, которой их можно было бы покормить - мясо.название>имя>