Что нужно дописать в код или метод написанный на 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 шт):
Если я вас правильно понял, то вы хотите вручную назначать все. Тогда для этого в абстрактном классе 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));
});
}
}