цель c категориями и наследованием - PullRequest
12 голосов
/ 10 августа 2011

Если метод определен как в классе, так и в категории этого класса, неизвестно, какая реализация будет вызвана.

Но как это взаимодействует с наследованием?В частности:

  • Учитывая метод категории суперкласса и обычный метод в подклассе, гарантируется ли, что реализация подкласса победит при вызове члена подкласса?
  • УчитываяОбычный метод суперкласса и метод категории подкласса, пытающийся переопределить его, гарантируется ли, что реализация категории подкласса победит при вызове члена подкласса?это гарантировало, что метод категории подкласса победит при вызове члена подкласса?

Ответы [ 3 ]

49 голосов
/ 10 августа 2011

Скажем так.Не переопределяйте методы с использованием категорий, периода, конца, конца ответа.

40 голосов
/ 10 августа 2011

Если метод определен как в классе, так и в категории этого класса, неизвестно, какая реализация будет вызвана.

Это неверно; метод категории всегда победит. Однако, что не сработает, так это если у вас есть несколько категорий, которые реализуют один и тот же метод, тогда «какая победит» не определена.

Обычно это «последние выигранные выигрыши», но на самом деле это тоже не жесткое правило.

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

Короче говоря, что сказал Иисус Навин; Не переопределять методы, использующие категории.

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

0 голосов
/ 20 мая 2014

Из того, что я тестирую

  1. Учитывая метод категории суперкласса и обычный метод в подклассе, гарантируется ли, что реализация подкласса победит при вызове члена подкласса?=> выигрывает подкласс
  2. Учитывая, что обычный метод суперкласса и метод категории подкласса пытаются переопределить его, гарантируется ли, что реализация категории подкласса победит при вызове члена подкласса?=> выигрывает категория подкласса
  3. Учитывая метод категории суперкласса и метод категории подкласса, гарантируется ли, что метод категории подкласса победит при вызове члена подкласса?=> выигрывает категория подкласса

Взгляните на категорию теста и подкласс

...