Java - перегрузка и переопределение - PullRequest
1 голос
/ 21 июля 2011
01    class SubClass extends SuperClass {}
02    class AppSuperClass {
03        /**
04         * @param superClass
05         */
06        public void print(SuperClass superClass) {
07            System.out.println("AppSuperClass:superclass is parameter");
08     
09        }
10        /**
11         * @param subClass
12         */
13        public void print(SubClass subClass) {
14            System.out.println("AppSuperClass:subclass is parameter");
15   
16        }
17    }
18   
19    class AppSubClass extends AppSuperClass {
20      /**
21       * @param superClass
22       */
23      public void print(SuperClass superClass) {
24          System.out.println("AppSubClass:superclass is parameter");
25   
26      }
27      /**
28       * @param subClass
29       */
30      public void print(SubClass subClass) {
31          System.out.println("AppSubClass:subclass is parameter");
32   
33      }
34  }
35  public class OverloadedTest {
36      public static void main(String[] args) {
37          AppSuperClass appSuperClass = new AppSuperClass();
38          AppSuperClass appSubClass = new AppSubClass();
39          SuperClass superClass = new SuperClass();
40          SuperClass subClassInstance = new SubClass();
41          /*
42           * Making request to print AppSuperClass
43           *  1. Passing SuperClass instance
44           *  2. Passing SubClass instance (*make note of the type) <img src="http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif?m=1304052800g" alt=":)" class="wp-smiley">
45           */
46   
47          appSuperClass.print(superClass);
48          appSuperClass.print(subClassInstance);
49          /*
50           * Above is repeated with AppSubClass instance
51           */
52          appSubClass.print(superClass);
53          appSubClass.print(subClassInstance);
54      }
55   
56  }

Когда я запускаю это, я получаю

       AppSuperClass:superclass is parameter
       AppSuperClass:superclass is parameter
       AppSubClass:superclass is parameter
       AppSubClass:superclass is parameter

Как я могу получить

           AppSuperClass:superclass is parameter
           AppSuperClass:subclass is parameter
           AppSubClass:superclass is parameter
           AppSubClass:subclass is parameter

как o / p без изменения типа какого-либо из объектов?

Ответы [ 3 ]

2 голосов
/ 21 июля 2011

Ваш вопрос не очень понятен, но, похоже, вы в основном после перегрузки время выполнения , которой просто нет в Java.Перегрузки полностью устраняются во время компиляции.Один из вариантов такой:

public void print(SuperClass superClass) {
    if (superClass instanceof SubClass) {]
        print((SubClass) superClass);
        return;
    }
    System.out.println("AppSuperClass:superclass is parameter");
}

Обратите внимание, что вам нужно сделать это и в переопределении, или иметь метод шаблона, который делает это, и отдельный метод printImpl(SuperClass), который можно переопределить вподкласс.

Чтобы довести это до логического предела, вы можете иметь:

class AppSuperClass {

    public final void print(SuperClass superClass) {
        if (superClass is SubClass) {
            printImpl((SubClass) superClass);
        } else {
            printImpl(superClass);            
        }
    }

    protected void printImpl(SuperClass superClass) {
        ...
    }

    protected void printImpl(SubClass subClass) {
       ...
    }
}

AppSubClass будет тогда переопределять только printImpl (одна или обе перегрузки).

РЕДАКТИРОВАТЬ: Как отмечено в комментариях, альтернативой является использование Шаблон посетителя .Это не тот шаблон, который мне безумно нравится, но , если , вы можете изменить SuperClass и SubClass, чтобы узнать о AppSuperClass (или интерфейсе, который он реализует), он может работать для вас.

0 голосов
/ 21 июля 2011

Проблема в том, что компилятор просто знает, что параметры имеют тип по крайней мере SuperClass, и не знает фактический тип объектов, которые вы присвоили переменным.Таким образом, он всегда использует метод, принимающий параметр SuperClass.

Вы можете проверить класс параметра в методе, но перегрузка, если вы хотите его использовать, здесь не работает, боюсь.

0 голосов
/ 21 июля 2011

Вы передаете параметры как SuperClass. Либо с использованием подлинного типа с начала, либо путем приведения при вызове метода.

SubClass subClassInstance = ....

Или используйте проверку типа экземпляра внутри метода.

...