Как избежать переопределения методов суперкласса подклассом в target - c - PullRequest
10 голосов
/ 19 мая 2010

Как в Java:

A final класс не может быть разделен на подклассы. Это сделано по соображениям безопасности и эффективности . Соответственно, многие из классов стандартной библиотеки Java являются окончательными, например, java.lang.System и java.lang.String. Все методы в конечном классе неявно являются окончательными.

Как мне добиться такого поведения в target-c?

Ответы [ 3 ]

11 голосов
/ 19 мая 2010

Вы не можете. Эффективность не входит в это. Если вы беспокоитесь о безопасности, не используйте цель-c. Всегда найдется способ обойти любые предпринимаемые вами меры.

7 голосов
/ 19 мая 2010

Как уже было сказано, вы не можете.

Однако, если вы создаете библиотеку (что является единственным случаем, в котором я все равно вижу, что это важно), есть несколько шагов, которые вы можете предпринять. Ну, один, правда.

Напишите в документации класса, что «Этот класс не предназначен для создания подклассов». (ref. NSIndexSet) или ". Не отменяйте этот метод. " (ref. +[NSApplication sharedApplication].

В качестве объяснения стоит отметить, что (в значительной степени) все, что происходит в Obj-C и что отделяет его от C, происходит во время выполнения, а время выполнения, так сказать, «прямо там». Любой фрагмент кода может проверять, изменять или искажать среду выполнения на досуге, что делает Obj-C ужасно мощным языком; особенно в отношении его "метаязычной" структуры.

4 голосов
/ 19 мая 2010

Нет окончательного эквивалента в target-c. Есть те же шаблоны, которые могут быть хорошей альтернативой, они дадут вам лучшее разделение, но ни производительность, ни безопасность:

  1. Если вы хотите разрешить перезапись определенных методов с использованием делегата, то шаблон может быть лучшим выбором.
  2. Если вы вообще не хотите создавать подклассы, тогда вы можете использовать шаблон abstract factory *1009*. Объявите открытый интерфейс + методы фабрики и скройте конкретные классы реализации.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...