Skip to content
This repository has been archived by the owner on May 24, 2022. It is now read-only.

Latest commit

 

History

History
39 lines (35 loc) · 4.31 KB

File metadata and controls

39 lines (35 loc) · 4.31 KB

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