Что нужно дописать в код или метод написанный на java ооп ,какой метод использовать ? или может класс super()?

У каждого животного есть ограничения на действия (бег: кот – 200 м., собака – 500 м.; прыжок: кот – 2 м., собака – 0.5 м.; плавание: кот не умеет плавать, собака – 10 м.); При попытке животного выполнить одно из этих действий, оно должно сообщить результат в консоль. (Например, dog1.run(150); -> результат: run: true) Нужно еще добавить

Что нужно дописать в код или метод написанный на java ооп ,какой метод использовать ? или может класс super()? чтобы при добавлении новое животное в класс main , я мог поставить ему новые ограничения. То есть у одной собаки ограничение на бег может быть например 500 у др 600 у третий 400

abstract class Animal {
    private final int MAX_RUN_LENGTH = 0;
    private final int MAX_SWIM_LENGTH = 0;
    private final double MAX_JUMP_HEIGTH = 0;

    abstract void run(int length);

    abstract void swim(int length);

    abstract void jump(double height);
}

class Cat extends Animal 
{
    private final int MAX_RUN_LENGTH = 200;
    private final double MAX_JUMP_HEIGTH = 2;
    @Override
    void run(int length) {
        if ((length >= 0) && (length <= MAX_RUN_LENGTH)) System.out.println("run: true");
        else System.out.println("run: false");
    }

    @Override
    void swim(int length) {
        System.out.println("swim: false");
    }

    @Override
    void jump(double height) {
        if ((height >= 0) && (height <= MAX_JUMP_HEIGTH)) System.out.println("jump: true");
        else System.out.println("jump: fase");
    }
}

class Dog extends Animal {
    private final int MAX_RUN_LENGTH = 500;
    private final int MAX_SWIM_LENGTH = 10;
    private final double MAX_JUMP_HEIGTH = 0.5;

    @Override
    void run(int length) {
        if ((length >= 0) && (length <= MAX_RUN_LENGTH)) System.out.println("run: true");
    }

    @Override
    void swim(int length) {
        if ((length >= 0) && (length <= MAX_SWIM_LENGTH)) System.out.println("swim: true");
        else System.out.println("swim: false");
    }

    @Override
    void jump(double height) {
        if ((height >= 0) && (height <= MAX_JUMP_HEIGTH)) System.out.println("jump: true");
        else System.out.println("jump: false");
    }
}

public class HW6_1to4 {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.run(201);
        cat.swim(1);
        cat.jump(1.9);

        Dog dog = new Dog();
        dog.run(500);
        dog.swim(10);
        dog.jump(0.4);
    }
}

Ответы (2 шт):

Автор решения: NarasuOo

Если я вас правильно понял, то вы хотите вручную назначать все. Тогда для этого в абстрактном классе Animal константы необходимо заменить на обычные поля, при этом их можно пометить модификатором доступа protected, для более простого доступа к ним из наследников. Теперь для того, чтобы вручную назначать ограничения, необходимо создать конструктор, который эти ограничения будет принимать и создавать экземпляр с этими ограничениями.

abstract class Animal {
    protected int runLength;
    protected int swimLength;
    protected double jumpHeight;

    abstract void run(int length);

    abstract void swim(int length);

    abstract void jump(double height);

    public Animal(int runLength, int swimLength, double jumpHeight) {
           this.runLength = runLength;
           this.swimLength = swimLength;
           this.jumpHeight = jumpHeight;
    }
}

Теперь классы наследники будете выглядеть следующим образом:

 class Cat extends Animal {

    public Cat(int runLength, int swimLength, double jumpHeight) {
        super(runLength, swimLength, jumpHeight);
    }

    @Override
    void run(int length) {
        if ((length >= 0) && (length <= runLength)) System.out.println("run: true");
        else System.out.println("run: false");
    }

    @Override
    void swim(int length) {
        System.out.println("swim: false");
    }

    @Override
    void jump(double height) {
        if ((height >= 0) && (height <= jumpHeight)) System.out.println("jump: true");
        else System.out.println("jump: fase");
    }
}

class Dog extends Animal {

    public Dog(int runLength, int swimLength, double jumpHeight) {
        super(runLength, swimLength, jumpHeight);
    }

    @Override
    void run(int length) {
        if ((length >= 0) && (length <= runLength)) System.out.println("run: true");
    }

    @Override
    void swim(int length) {
        if ((length >= 0) && (length <= swimLength)) System.out.println("swim: true");
        else System.out.println("swim: false");
    }

    @Override
    void jump(double height) {
        if ((height >= 0) && (height <= jumpHeight)) System.out.println("jump: true");
        else System.out.println("jump: false");
    }
}

Теперь мы можем использовать мощь полиморфизма. Обратите внимание, что у переменной cat тип данных Animal. Это нужно, чтобы мы могли использовать полиморфизм.

public static void main(String[] args) throws InterruptedException {
    Animal cat = new Cat(120,50,30);
    cat.jump(20);
}

Как видно из примера, мы передаем ограничения прямо в конструкторе. Если вы хотите передавать только определенные ограничения, а остальные оставлять по умолчанию, то советую использовать паттерн "Строитель" (Builder)

→ Ссылка
Автор решения: Дмитрий

Хороший вопрос, надеюсь, это поможет вам разобраться

abstract class Animal {
    private final int numb;
    private final double maxRunLength;
    private final double maxSwimLength;
    private final double maxJumpLength;

    public Animal(double maxRunLength, double maxSwimLength, double maxJumpLength, int numb) {
        this.maxRunLength = maxRunLength;
        this.maxSwimLength = maxSwimLength;
        this.maxJumpLength = maxJumpLength;
        this.numb=numb;
    }

    //паттерн фабричный метод - для создания экземпляров класса, наследующих класс Animal и приведение их к родителю
    //в этом случае классы, в которых необходимо использовать объекты, наследующие класс Animal, имеют ссылку только на суперкласс Animal, но не на его наследников
    //таким образом достигается Low Coupling (паттерн GRASP)
    public static Animal of(AnimalType animalType){
        switch(animalType){
            case CAT: return new Cat();
            case DOG: return new Dog();
            default: throw new UnsupportedOperationException();
        }
    }

    public String run(int length) {
        return print ("run",length<=maxRunLength,length);
    }

    public String swim(int length) {
        return print ("swim",length<=maxSwimLength,length);
    }




    public String jump(double length) {
        return print ("jump",length<=maxJumpLength,length);
    }

    private String print(String move, boolean done, double length){
        return name()+numb+"."+move+"("+length+")"+"; -> результат: "+move+": "+done;
    }

    // реализация паттерна шаблонный метод
    // методы сцперкласса run, swim, jump вызывают фактически не реализованный на уровне суперкласса метод name
    // результат выполнения метода name будет разный в зависимости от того, какой именно объкект-наследник будет инстанциирован    
    // это и есть одно из возможных проявлений полифорфизма
    public abstract String name();

}

enum AnimalType{
    CAT,DOG;
}

class Cat extends Animal {

    private static int counter=1;

    private final static double MAX_RUN_LENGTH = 200;
    private final static double MAX_SWIM_LENGTH = 0;
    private final static double MAX_JUMP_HEIGTH = 2;

    //при создании экземпляра класса в конструкторе определяется максимальная длина прыжка, бега, плавания конкретно для кота 
    public Cat() {
        super(MAX_RUN_LENGTH, MAX_SWIM_LENGTH, MAX_JUMP_HEIGTH, counter++);
    }

    @Override
    public String name() {
        return "cat";
    }

}

class Dog extends Animal {

    private static int counter=1;

    private final static double MAX_RUN_LENGTH = 500;
    private final static double MAX_SWIM_LENGTH = 10;
    private final static double MAX_JUMP_HEIGTH = 0.5;

    //при создании экземпляра класса в конструкторе определяется максимальная длина прыжка, бега, плавания конкретно для собаки 
    public Dog() {
        super(MAX_RUN_LENGTH, MAX_SWIM_LENGTH, MAX_JUMP_HEIGTH, counter++);
    }

    @Override
    public String name() {
        return "dog";
    }

}

import java.util.ArrayList;
import java.util.List;
import static nnnn.AnimalType.*;

public class HW6_1to4 {

    public static void main(String[] args) {

        final List<Animal> animals = new ArrayList<>();        
        animals.add(Animal.of(CAT));
        animals.add(Animal.of(DOG));
        animals.add(Animal.of(CAT));

        animals.forEach(animal -> {
            // методы run,swim,jump отрабатывают по разному для созданных экземпляров класса Dog,Cat, 
            // хотя фактически всегда обращаемся к переменной типа Animal (коллекция типизирована суперклассом Animal)
            // это и есть одно из возможных проявлений полифорфизма
            System.out.println(animal.run(500));
            System.out.println(animal.swim(5));
            System.out.println(animal.jump(1));
        });

    }

}
→ Ссылка