Created
October 30, 2018 21:12
-
-
Save Shtaba09/b0480112a5442a41eaacc05617e2377a to your computer and use it in GitHub Desktop.
Класс внутри класса и класом поганяет
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.javarush.task.task24.task2408; | |
import java.util.Date; | |
/* | |
В работе вам иногда будет нужно закастить класс к какому-нибудь другому классу, не интерфейсу :))) | |
Класс DogPet использует 2 класса - SuperDog и Dog, разберись с getName в классе DogPet | |
Так намного лучше, чем Copy+Paste! | |
*/ | |
public class Dog implements Pet { | |
private String name; | |
public Dog(String name) { | |
this.name = name; | |
} | |
/** | |
* Если так получилось, что есть готовый класс А (тут SuperDog) с логикой, которую вы хотите использовать. | |
* То возможны 3 способа: | |
* 1) из класса А скопировать логику себе (это плохо, т.к. поддерживать несколько копий одного и того же кода проблематично) | |
* 2) создать экземпляр класса А внутри нашего класса и использовать его, связь has-a (не всегда подходит, т.к. класс А сам по себе) | |
* 3) создать внутренний класс, который наследуется от А, использовать его методы вместе с | |
* методами и полями нашего класса, т.к. внутренний класс имеет доступ к своему родителю как наследник, | |
* а также ко всем полям и методам включая private того класса, в который он вложен. | |
* <p/> | |
* Итак, разбираемся с п.3: | |
* Внутри метода toSayable создайте class DogPet, который наследуется от SuperDog и реализует интерфейс Sayable | |
* создайте метод private String getName(), который будет использовать логику двух классов - Dog и SuperDog. | |
* Пусть этот метод возвращает имя собаки (класс Dog), которое с обеих сторон выделено getSuperQuotes (класс SuperDog) | |
* Пример, " *** Барбос *** " | |
* Логика метода say: | |
* Если i < 1, то используя метод getName вывести на экран, что собака спит. Пример, " *** Шарик *** спит."' | |
* Иначе вывести фразу: "имя_собаки лает гааав! сегодняшняя_дата". Пример для i=3, " *** Тузик *** лает гааав! 13-ноя-2013 Ср" | |
* Для форматирования даты используйте formatter из класса SuperDog. | |
* <p/> | |
* <b>Пример вывода:</b> | |
* *** Барбос *** лает гааааав! 13-ноя-2013 Ср | |
* *** Тузик *** лает гаав! 13-ноя-2013 Ср | |
* *** Бобик *** лает гааав! 13-ноя-2013 Ср | |
* Мышь пищит. | |
* *** Шарик *** спит. | |
* | |
* @param i количество букв 'а' в слове гав | |
* @return экземпляр класса DogPet | |
*/ | |
public Sayable toSayable(final int i) { | |
class DogPet extends SuperDog implements Sayable{ | |
public String getName() { | |
SuperDog superDog=new SuperDog() { | |
@Override | |
protected String getSuperQuotes() { | |
return super.getSuperQuotes(); | |
} | |
}; | |
return superDog.getSuperQuotes()+name+superDog.getSuperQuotes(); | |
} | |
@Override | |
public String say() { | |
String say="г"; | |
for (int j=0; j<i; j++){ | |
say+="а"; | |
} | |
return i<1? getName()+" спит." : getName()+" лает "+say+"в! "+ formatter.format(new Date()); | |
} | |
} | |
return new DogPet(); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.javarush.task.task24.task2408; | |
/* | |
обратите внимание, как именно Mouse отличается от Dog | |
Этот класс - привычный для вас. | |
*/ | |
public class Mouse implements Pet, Sayable { | |
@Override | |
public Sayable toSayable(int i) { | |
return this; | |
} | |
@Override | |
public String say() { | |
return "Мышь пищит."; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.javarush.task.task24.task2408; | |
public interface Pet { | |
public Sayable toSayable(int i); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.javarush.task.task24.task2408; | |
public interface Sayable { | |
String say(); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.javarush.task.task24.task2408; | |
import java.util.List; | |
/* | |
Как избежать Copy+Paste | |
*/ | |
public class Solution { | |
public static void main(String[] args) { | |
List<Pet> pet = Util.getPets(); | |
List<Sayable> pets = Util.convertPetToSayable(pet); | |
Util.printDialog(pets); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.javarush.task.task24.task2408; | |
import java.text.SimpleDateFormat; | |
public abstract class SuperDog { | |
protected String getSuperQuotes() { | |
//some logic here | |
return " *** "; | |
} | |
protected SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy EEE"); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.javarush.task.task24.task2408; | |
import java.util.LinkedList; | |
import java.util.List; | |
public class Util { | |
//Util отлично работает с классами Dog, Mouse. | |
public static void printDialog(List<Sayable> pets) { | |
for (int i = 0; i < pets.size(); i++) { | |
System.out.println(pets.get(i).say()); | |
} | |
} | |
public static List<Pet> getPets() { | |
List<Pet> pets = new LinkedList<>(); | |
pets.add(new Dog("Барбос")); | |
pets.add(new Dog("Тузик")); | |
pets.add(new Dog("Бобик")); | |
pets.add(new Mouse()); | |
pets.add(new Dog("Шарик")); | |
return pets; | |
} | |
public static List<Sayable> convertPetToSayable(List<Pet> pets) { | |
List<Sayable> result = new LinkedList<>(); | |
for (Pet pet : pets) { | |
int i = (int) (Math.random() * 7) - 2; | |
result.add(pet.toSayable(i)); | |
} | |
return result; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
taskKey="com.javarush.task.task24.task2408" | |
Как избежать Copy+Paste | |
В классе Dog реализуй логику метода toSayable, которая описана в джавадоке. | |
Требования: | |
1. В классе Dog должен быть реализован публичный метод toSayable с одним параметром типа int. | |
2. Метод toSayable должен возвращать объект типа Sayable. | |
3. Объект возвращаемый методом toSayable должен быть потомком класса SuperDog. | |
4. В случае, если параметр переданный в метод toSayable меньше 1, метод say должен вернуть строку с сообщением о том что собака спит (формат согласно javadoc). | |
5. В случае, если параметр переданный в метод toSayable больше либо равен 1, метод say должен вернуть строку с сообщением о том что собака лает и текущую дату (формат согласно javadoc). | |
6. Программа должна выводить данные на экран. | |
7. В методе getName класса DogPet должен быть вызван метод getSuperQuotes класса SuperDog. | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment