Я довольно новичок в Java и хотел бы знать, как выполнить следующую задачу, а также, считается ли это плохим стилем, даже если это возможно. Спасибо.Как игнорировать/обходить переопределенный метод?
Fish f; // Fish is a superclass,
Tuna t = new Tuna(); // to which Tuna is a subclass.
f=t; // the Fish object "f" now refers to the Tuna object "t".
// Both Fish and Tuna have an identical method (signature wise) called swim() ,
f.swim(); // and so Tuna's overridden swim() method is invoked here.
Но я могу теперь получить плавать рыбы() метод, который будет вызываться, используя один и тот же «f.swim()
» синтаксис?
// I would now like Fish's swim() method to be invoked here,
// but is it bad style and/or am I missing some point about OOP?
f.swim();
Edit:
Re: ответы, спасибо люди! Что касается ответа SO пользователя Rinke ниже, он заявляет, что «вы можете назначить свой экземпляр тунца как переменным тунца, так и рыбы, но он всегда будет тунцом».
Последняя часть этого предложения заставила моего начинающего мозг OOD удивляться: почему позволить «супер-объекту» ссылаться на «под-объект»? Какая польза от этой гибкости? Какая польза в том, чтобы позволить Рыбному объекту «переключаться между» или «рыбой» или тунцом? Спасибо.
Edit 2:
Вот несколько примеров кода, чтобы проиллюстрировать концепцию так что пользователь Rinke в «ответ на редактирование» ответ ниже.
Bear b = new Bear();
Fish f = getAnyFish();
b.eat(f);
Fish getAnyFish(){
//To toggle the returned fish type, change true to false
if (true) return new Tuna();
else return new Salmon();
}
Возможно, мне не хватает что-то, но если Tuna определяет свой собственный переопределяющий 'swim()', не будет ли это то, что вызывает 'f.swim()'? Как интерфейс меняет все, что происходит? – Teepeemm
Да, правильно. Вот почему я не реализовал интерфейс в классе Tuna в основном из-за требования плаката. –
Итак, ваш ответ добавляет интерфейс, но не делает то, что спросил OP? – Teepeemm