Делаем переменные суперкласса доступными только для чтения дочерним элементам в TCL OO

У меня есть класс foo с переменной bar. Теперь ... Я хочу, чтобы если есть класс moo, у которого класс foo в качестве суперкласса, я хочу, чтобы любые попытки записи или, что еще лучше, даже ссылки непосредственно на bar, приводили к ошибкам. Это может спасти ситуации, когда кто-то использует мой код (который может быть скомпилирован в байт-код), чтобы не переопределить, имея собственную переменную с тем же именем.


person user1134991    schedule 17.01.2018    source источник


Ответы (1)


TclOO просто не поддерживает эту концепцию. Классы не являются границами безопасности в TclOO, точно так же, как пространства имен не являются границами безопасности в простом Tcl (объекты TclOO на самом деле являются просто причудливыми пространствами имен). Границы безопасности Tcl находятся между интерпретаторами и между уровнем сценария Tcl и (обычно) уровнем реализации C. Мы рассматриваем возможность добавления «частных» переменных экземпляра для Tcl 8.7, но даже они не будут по-настоящему частными; их имена по-прежнему будут предсказуемыми, если вы знаете, как (и они будут доступны извне класса; это важно при использовании переменной со сторонним кодом, таким как Tk). Повторяю: классы не являются границами безопасности.

Если у вас есть что-то, что нужно заблокировать вне поля зрения, проще всего реализовать это на C. Вы можете подключить реализованы на C в TclOO (применяя любые элементы управления, о которых вы можете подумать), и эти методы могут использовать (только для уровня C) механизм метаданных для создания хранилища, подключенного к экземпляру, которое они могут использовать. Все обратные вызовы используются для правильного удаления в нужное время. Методы в C не намного сложнее команд в C; сигнатура обратного вызова функции немного отличается, и использование немного сложнее (потому что есть другие стандартные операции с методами, такие как их копирование), но если вы можете сделать одно, вы можете выяснить, как сделать и другое.

person Donal Fellows    schedule 17.01.2018