Пропустить реализацию класса в дереве наследования - PullRequest
2 голосов
/ 13 августа 2011

У меня следующая структура класса:

Class Human, with message("Hello, ")
Class Townsmen extends Human, with message("I live in town.")
Class Merchant extends Townsmen, with message("I'm merchant.")

Можно ли экземпляру Merchant сказать «Привет, я продавец», используя super вызовы?У меня есть программа на Java, и код гораздо сложнее, но идея та же.Кроме того, я не могу изменять ни классы людей, ни жителей города.

Ответы [ 4 ]

3 голосов
/ 13 августа 2011

Ну, вы можете взломать, используя отражение, чтобы получить то, что вы хотите (см. Почему super.super.method (); не разрешен в Java? ). Однако, НЕ!

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

Как правило: если вы пытаетесь достичь чего-то очень уникального, что сам язык пытается ограничить, возможно, что-то не так с вашим дизайном. (мои 2 цента;))

3 голосов
/ 13 августа 2011

Все, что я могу думать, это: Class Merchant extends Human, with message("I'm merchant.")

Я не думаю, что вы можете пропустить конструкторы суперкласса, которые вам не нравятся - наследование не работает

1 голос
/ 13 августа 2011

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

      Human
     /     
  TownMember
  /       \
 Townsmen  Merchant

С TownMember, обладающим любой логикой, которую у горожан есть, которую унаследовал этот торговец.

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

0 голосов
/ 13 августа 2011

Вы можете заставить Торговца не вызывать супер метод и делать то, что когда-либо делал Human.message.Он может использовать отражения, если разрешения являются проблемой.

Однако, похоже, что Торговец не Горожанин и должен расширить Человека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...