2014-12-12 2 views
0

Допустим, что мне дан object O по некоему методу.Доступ к базовой части производного объекта

Этот объект O получен из базового объекта BaseClass и как таковой имеет часть, тип которой является BaseClass.

Как я могу получить доступ к этой части, когда я нахожусь в этом методе, что означает, что super не работает, потому что я не в контексте объекта.

Спасибо!

ответ

3

Позвольте мне перефразировать ваш вопрос, чтобы убедиться, что я его понимаю. У вас есть класс O, содержащий метод (скажем, «тест»). В этом методе вы хотите получить доступ к переменной экземпляра, принадлежащей суперклассу BaseClass.

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

Вам следует рассмотреть возможность создания методов get и set для переменной и доступа к переменной путем вызова этих методов из подкласса, но это необязательно.

1

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

Предположим, у вас есть два класса C и D и экземпляр С C. Теперь предположим, что C наследует от C ', и вы хотите вызвать метод m, определенный в C', который был переопределен в C. Выражение cm активирует реализацию на C, а не ту, что в C ', потому что c class == C, а не C '. Как вы сказали, нет «удаленной» версии супер, которую вы могли бы использовать от D.

Если вы хотите активировать метод в C ', тогда вы должны перенести исходный код m в C' на другой метод, скажем m0, и переопределить m в C ', чтобы он просто делегировал m0 (^ self m0). Сохраняйте метод m в C неизменным и затем вызывайте из D, используя m0 (c m0) вместо m (c m).

Обратите внимание, что иначе не будет работать: если вы определяете m0 в C 'как^self m, выражение c m0 активирует версию m, найденную в C, а не C'.

Вы также можете определить m0 в C как^супер m, и таким образом c m0 активирует C '>> m. Однако использование супер с другим селектором не считается хорошей практикой, и вы должны не делать этого.