Что если у моих подклассов тоже разные методы? - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть вопрос о полиморфизме в Java. У меня есть абстрактный базовый класс Shape и два производных класса Rectangle и Circle. Я знаю, что могу вызывать переопределенные методы в классах Circle и Rectangle со ссылкой на класс Shape, но что, если у меня есть метод, которого нет у класса Shape, а у класса Circle. Как я могу использовать полиморфизм в этой ситуации?

Ответы [ 4 ]

0 голосов
/ 27 февраля 2020

Вы не можете использовать полиморфизм в этой ситуации. Сама идея полиморфизма заключается в том, что вы можете использовать объект указанным способом, независимо от его фактической формы (например, c тип объекта). Требуя доступа к методу, который уникален (буквально) для конкретной c формы, вы должны предвидеть go полиморфизм.

( Приведенный выше аргумент не будет применяться, если Circle действительно имеет подклассы, и в этом случае вы можете полиморфно вызывать эти методы, но это просто перемещение аргумента в другое место .)

0 голосов
/ 26 февраля 2020

Если вы сохраняете Circle в экземпляре Shape, вы можете вызывать методы Circle для s, приводя s к Circle:

Shape s = new Circle();
...
if ( s.instanceof(Circle) ) {
   ((Circle)s).circleMethod();
}
0 голосов
/ 26 февраля 2020

Помимо решения для приведения, предложенного другими ответами, если вы думаете, что все подклассы Shape должны предоставлять этот метод, но вы не можете / не хотите реализовывать его на Shape, вы можете объявить метод как Аннотация и реализовать метод в Circle и Rectangle.

public abstract class Shape {
    public abstract void foo();
}


public class Circle extends Shape {
    public void foo() {
        // Implementation
    }
}

, тогда вы можете сделать:

Shape s = new Circle();
s.foo();
0 голосов
/ 26 февраля 2020

Это происходит постоянно. Ответ в том, что вам нужно привести свою форму к кругу, чтобы получить доступ к методу

Shape s = ...;
if (s instanceof Circle) {
  ((Circle)s).foo(); //method only on Circle
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...