Вызов переопределенной функции в абстрактном классе - PullRequest
0 голосов
/ 06 сентября 2011

Итак, у меня есть abstract class Worker, который имеет абстрактную функцию computePay.

Двумя классами этого класса являются HourlyWorker и FixedWorker, Теперь я обеспечил реализацию computePay в обоих этих классах. Теперь мой код говорит

Worker[] w=new worker[2];
w[0]=new HourlyWorker;
w[1]=new FixedWorker;

теперь, когда я говорю w[0].computePay как я уверен, что вызывается computePay, я знаю, что будет назван тот из дочернего класса, но какой?

т.е. Если оба моих дочерних класса имеют различную реализацию функции computePay, следующий код даст мне желаемый результат?

w[0].computePay //Prints the pay as per the implementation in HourlyWorker;
w[1].computePay //Prints the pay as per the implementation in FixedWorker;

Также я слышал об операторе / ключевом слове instance of, но я не знаю, будет ли оно здесь полезным?

Ответы [ 3 ]

7 голосов
/ 06 сентября 2011

Да, Java обеспечит вызов «правильного» метода.

Нет необходимости отправки вручную с использованием instanceof.

Я знаю, что будет назван тот из дочернего класса, но какой?

A Основная концепция ООП заключается в том, что вам не нужно знать. Вы программируете интерфейс, определенный в вашем абстрактном классе, и вам не нужно знать, какая реализация используется здесь (или что она делает).

2 голосов
/ 06 сентября 2011

Я знаю, что будет вызван объект из дочернего класса, но какой?

Тип фактического вашего объекта.Поэтому, если ваш объект равен a HourlyWorker (инициализирован new HourlyWorker()), вы вызовете метод computePay этого типа.

Ключевое слово instance of используется для проверкиобъект имеет указанный тип.Он не должен использоваться в хороших проектах (кроме случаев переопределения equals).Это бесполезно здесь.Напротив, вы должны полагаться на полиморфизм, как вы предложили.

0 голосов
/ 06 сентября 2011

Методы в java по умолчанию являются виртуальными (как в CPP вы должны использовать ключевое слово virtual), поэтому java будет следить за тем, чтобы методы вызывались в отношении объекта, а не ссылки. Абстрактный метод - это чисто виртуальная функция C ++

Также обратите внимание, что instanceof здесь не будет полезен, поэтому избегайте его.

...