Подтвердить что ты не робот

Объективные категории c и наследование

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

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

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

Ответ 1

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

Ответ 2

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

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

Это, как правило, "последние загруженные победы", но это тоже не тяжелое правило.

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

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

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

Ответ 3

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

  • Для метода категории суперкласса и регулярного метода в подкласс, гарантируется, что реализация подкласса выиграет когда вызывается на член подкласса? = > побеждает подкласс
  • С учетом стандартного метода суперкласса и метода подкласса пытаясь переопределить его, гарантировано ли, что категория подкласса реализация победит, когда будет вызван член подкласса? = > категория подкласса выигрывает
  • Учитывая метод категории суперкласса и метод категории подкласса, гарантировано, что метод категории подкласса победит, когда называется членом подкласса? = > категория подкласса выигрывает

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