Herança e Composição/Exercício 05: Animal, Cão, Gato

From Wiki**3

< Herança e Composição

Problema

Considere o conceito de animal, contendo as propriedades idade e nome. Considere ainda as especializações deste conceito: cão e gato. Os conceitos cão e gato têm, respectivamente, o peso e o número de vidas como propriedades adicionais. Considere que todos os animais dormem, mas que apenas os gatos trepam e que apenas os cães ladram. Implemente em Java as classes que representam estes conceitos: cada método dos anteriores deve ser implementado simplesmente com uma instrução que apresente uma cadeia de caracteres descritiva da acção. Implemente ainda os métodos que permitem comparar instâncias para cada uma das classes (equals), assim como os métodos de linearização textual (toString). Os animais genéricos podem ser inicializados especificando-se apenas a idade (neste caso, o nome é vazio), mas podem ser também inicializados especificando-se ambas as propriedades (a acção para a idade é idêntica à anterior). Os cães e os gatos são sempre inicializados com explicitação das suas respectivas propriedades, i.e., idade, nome e peso ou número de vidas (conforme o caso). Construa uma aplicação (main) que ilustre a utilização das classes.

Solução: diagrama de classes UML

Solução: código Java

Animal
public class Animal {
  private int _age = 0;
  private String _name = "";

  public Animal(String name, int age) {
    _age = age;
    _name = name;
  }

  @Override
  public boolean equals(Object other) {
    if (other instanceof Animal animal) {
      return _name.equals(animal._name) && _age == animal._age;
    }
    return false;
  }

  @Override
  public String toString() {
    return _name + " is " + _age + " years old";
  }

}
Dog
public class Dog extends Animal {
  private double _weight = 0.0;

  public Dog(String name, int age, double weight) {
    super(name, age);
    _weight = weight;
  }

  @Override
  public boolean equals(Object other) {
    if (other instanceof Dog dog) {
      return super.equals(other) && _weight == dog._weight;
    }
    return false;
  }

  @Override
  public String toString() {
    return super.toString() + " and " + _weight + " kg";
  }

}
Cat
public class Cat extends Animal {
  private int _lives = 0;

  public Cat(String name, int age, int lives) {
    super(name, age);
    _lives = lives;
  }

  @Override
  public boolean equals(Object other) {
    if (other instanceof Cat cat) {
      return super.equals(other) && _lives == cat._lives;
    }
    return false;
  }

  @Override
  public String toString() {
    return super.toString() + " and " + _lives + " lives";
  }

}
App
public class App {
  public static void main(String[] args) {
    Dog d1 = new Dog("Fido", 1, 1.3);
    Dog d2 = new Dog("Bob", 2, 5.6);
    System.out.println("d1: " + d1);
    System.out.println("d2: " + d2);
    System.out.println("d1 == d2? " + d1.equals(d2));

    Dog c1 = new Cat("Pantufa", 1, 3);
    Dog c2 = new Cat("Tareco", 2, 5);
    System.out.println("c1: " + c1);
    System.out.println("c2: " + c2);
    System.out.println("c1 == c2? " + c1.equals(c2));
  }
}