Интерфейс 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);
  }
}
Другие вопросы по тегам