Я недавно столкнулся со следующим сценарием:Полиморфизм и перегрузка
У меня есть суперкласс A и класс B, вытекающие из него. Функция, например oracle, возвращает объект любого типа. Я хочу делать разные вещи в зависимости от типа, но я не могу ввести новую функцию-член для A и B.
Одним из решений является ветвление в соответствии с getClass(). GetName(). Тем не менее, мне было интересно, может ли полиморфизм добиться такого же поведения с помощью перегрузки:
public class Main
{
static class A{}
static class B extends A{}
public static void foo(A a) { System.out.println("A"); };
public static void foo(B b) { System.out.println("B"); };
static A oracle()
{
return (Math.random() > 0.5) ? new A() : new B();
}
public static void main(String[] args)
{
A x = oracle();
foo(x);
}
}
Это всегда выводит «А» и мое подозрение, что это из-за раннего связывания используется для разрешения вызовов функций. Может ли кто-нибудь признать это?
Вы передаете ему переменную типа 'A', поэтому он вызывает метод, чья подпись принимает' A'. Я думаю, что единственный способ использовать getClass(). GetName() ', как вы упомянули. – iamnotmaynard
@iamnotmaynard Я бы написал это как решение (немного более подробно, возможно). – SJuan76
Точно. Если вам абсолютно необходимо, вы можете использовать оператор 'instanceof' для включения фактического типа объектов.Но лучше OO-Design поставить 'foo()' внутри классов A и B (поэтому объекты знают, что сказать «)» –