Интерфейс Java и его реализация
Я делаю упражнение, которое требует DogSchool для реализации PetSchool. Я намерен составить список животных, которые зарегистрированы в школе для домашних животных, и в школе для собак необходимо отличать собак от других животных. Характерной чертой собак является их крик "Вау! Вау!". Я исправил. Но все же это не может отличить собак от кошек.
Уровень = Животное
Это код интерфейса.
import java.util.ArrayList;
public interface PetSchool {
boolean add(Tier tier);
boolean addAll(ArrayList<Tier> tiere);
boolean remove(Tier tier);
ArrayList<Tier> getTiere();
}
This is the code of Implementation.
Please tell me what's wrong with it.
import java.util.ArrayList;
public class DogSchool implements PetSchool {
public ArrayList<Tier> tiere= new ArrayList<Tier>();
@Override
public boolean add(Tier t){
if(t.gibLaut().equalsIgnoreCase("Wau! Wau!")){
return tiere.add(t);
}
else {
return false;
} }
@ Override
public boolean addAll(ArrayList<Tier> tiere){
return this.tiere.addAll(tiere);
}
@Override
public boolean remove(Tier t){
if(!t.gibLaut().equalsIgnoreCase("Wau! Wau!")){
return tiere.remove(t);
}
else{
return false;
}
}
@Override
public ArrayList<Tier> getTiere() {
return new ArrayList<Tier>(this.tiere);
}
}
Ну, проблема происходит в демо-тесте:
import java.util.ArrayList;
public class TierDemo {
public static void main(String[] args) {
System.out.println("Test Teil 2:");
DogSchool schule = new DogSchool();
schule.add(new Hund());
schule.add(new Katze());
schule.add(new Hund());
schule.add(new Katze());
schule.addAll(tiere);
for (Tier t : schule.getTiere()) {
System.out.println(t.gibLaut());
}
}
После компиляции он показывает:
Test Teil 2:
Wau! Wau!
Wau! Wau!
Miau!
Wau! Wau!
что лучше, но все же он не может отличить собак от кошек.
2 ответа
У вас много ошибок. Главное, на что нужно обратить внимание, - это то, что вы должны инициализировать список Tire и использовать его во всех ваших методах, а не создавать новый ArrayList в каждом методе.
public ArrayList<Tier> tiere; // you forgot to initialize this ArrayList
@Override
public boolean add(Tier t){
ArrayList<Tier> neu= new ArrayList<Tier>();
if(t.gibLaut().equalsIgnoreCase("Wau! Wau!")){
return neu.add(t); // this list is local to the method, you should be adding to tiere
}
else {
return false;
} }
@ Override
public boolean addAll(ArrayList<Tier> tiere){
ArrayList<Tier> neu= new ArrayList<Tier>(); // remove this list
return tiere.addAll(neu); // should be this.tiere.addAll(tiere);
}
@Override
public boolean remove(Tier t){
ArrayList<Tier> neu= new ArrayList<Tier>(tiere.size()); // remove this
if(!t.gibLaut().equalsIgnoreCase("Wau! Wau!")){
return neu.remove(t); // should remove from tiere
}
else{
return false;
}
}
@Override
public ArrayList<Tier> getTiere() {
return new ArrayList<Tier>(); // should either return tiere or a copy of it (i.e. new ArrayList<Tier>(tiere))
}
В основном все не так с вашим кодом. Ни одна из ваших реализаций не изменяет ваш уровень. Кроме того, проверка звука животного может быть не самым безопасным способом проверки.
Предполагая, что у вас есть класс собаки
class Dog implements Tier {
}
Это может работать, хотя в вашем описании отсутствуют некоторые детали.
public class DogSchool implements PetSchool {
// make your internal list private to prevent unqualidfied modification
private ArrayList<Tier> dogs = new ArrayList<>();
public boolean add(Tier tier) {
// check the type of the animal and add it to your internal list
if (tier instanceof Dog) {
return this.dogs.add(tier);
}
return false;
}
public boolean addAll(ArrayList<Tier> tiere) {
// only add the dogs if every animal in the list is a dog
for (Tier t: tiere) {
if (!(t instanceof Dog))
return false;
}
return this.dogs.addAll(tiere);
}
public boolen remove(Tier tier) {
return this.dogs.remove(tier);
}
public ArrayList<Tier> getTiere() {
// return a copy so no one can modify your internal list
return new ArrayList<>(this.dogs);
}
}