2015-04-04 1 views
0

Я работаю над проектом atm, который требует от меня использования концепций полиморфизма.Методы вызова полиморфизма Java для подклассов в массиве SuperClass

У меня такой вопрос:

Imagine У меня есть интерфейс, который представляет все млекопитающие, то я создаю следующие подклассы: Человек и кит.

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

Вещи есть, суб-класс Human имеет метод solveMathProblem(), в то время как Whale класс не имеет его, поэтому ни один не делает млекопитающее.

Как я могу использовать этот метод в массиве (например: mammals[2].solveMathProblem();)?

Это не будет работать, так как solveMathProblem() не указано в млекопитающим интерфейс, потому что только люди могут это сделать)

Что я могу сделать, чтобы сделать эту работу?

+0

Поскольку у вас есть только экземпляры типа Mammal, вы не можете использовать какие-либо методы, которые не определены в этом типе. Если вы хотите использовать методы подтипа, вам нужно передать свои объекты в Human, что не удастся (путем исключения исключения), если объект не соответствует новому типу. Оператор 'instanceof' также может быть полезен. –

+0

Вы можете использовать литье как '((человеческие) млекопитающие [2]). SolveMathProblem();' но чтобы быть уверенным, что 'млекопитающие [2]' вам нужно проверить 'if (млекопитающие [2] instanceof Human)' first. Кроме того, использование кастинга чаще всего означает, что ваш проект должен быть переработан, поскольку * литье * не является полиморфизмом. – Pshemo

+0

@Joao, хотя и не обязательно, это не повредило бы принять один из ответов, который помог бы вам ответить на ваш вопрос [в знак признательности тому, кто провел свободное время, помогая вам бесплатно :)] – CKing

ответ

0

Ссылка суперкласса на объект подкласса не может получить доступ к методам, не определенным в суперклассе.

Вам нужно будет явно привести вашу ссылку млекопитающего на человек ссылку для того, чтобы иметь возможность получить доступ к методам, присутствующие в организме человека, как показано ниже:

((Human)mammals[2]).solveMathProblem(); 

Это, как говорится, вы должны смотреть в шаблоне «Стратегия» о том, как добавить поведение посредством композиции. This Ответ делает довольно хорошую работу в объяснении концепции. В вашем конкретном случае вы можете добавить разные типы поведения к различным реализациям млекопитающих, введя новую иерархию поведения.

0

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

0

Есть два способа я могу думать и как может быть хорошо:

  1. Вы можете объявить solveMathProblem для Mammalinterface:

    • объявляет метод для interface
    • создать a class, под названием MammalCore
    • implement метод solveMathProblem в MammalCore таким образом, что он будет бросать исключение, которое будет утверждать, что данная операция не поддерживается (так он будет поведение по умолчанию)
    • переопределение solveMathProblem для Human Таким образом, если вы звоните solveMathProblem в массиве, будет сгенерировано исключение для Whale экземпляров, и это будет точно выполняться для человека экземпляров
  2. Вы можете использовать Reflection.В вашем цикле вы можете проверить каждый объект, существует ли solveMathProblem (How To Check If A Method Exists At Runtime In Java?) и invoke метод, если это так.

+0

Я все еще чувствую шаблон стратегии - лучший вариант. – CKing

+0

Основная идея заключается в том, что вы не хотите использовать метод для китов. Если проблема 2 + 2, и вы вызываете solveMathProblem, вы должны получить исключение, если оно должно быть обработано китом. Преобразование в человека и выполнение метода плохое, так как результатом будет то, что кит решил проблему, что, очевидно, не так, как должно работать. –

Смежные вопросы