View on GitHub

Scala

весна 2022

Домашнее задание №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]`, а произвольные животные не могут есть молоко. Единственная еда, которой их можно было бы покормить - мясо.