Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
- | <P STYLE="margin-bottom: 0cm">ЯП 16.11.06</P>
| + | == From Ebaums Inc to MurkLoar. == |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | We at EbaumsWorld consider you as disgrace of human race. |
- | </P>
| + | Your faggotry level exceeded any imaginable levels, and therefore we have to inform you that your pitiful resourse should be annihilated. |
- | <P STYLE="margin-bottom: 0cm">Защита</P>
| + | Dig yourself a grave - you will need it. |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Видимость / Доступ</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Модульные языки (Ада, Модула 2) –
| + | |
- | есть управление видимостью.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В ОО языках – управление
| + | |
- | доступом.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Если какой-то член невидимый,
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Разница между видимостью и доступом
| + | |
- | проявляется при наследочвании:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">X:
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> private:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> i</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Y:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> public</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> i</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Представим, что i – виртуальная
| + | |
- | функция. Если i в. ф. , то если бы был подход на уровне функции, то
| + | |
- | его было бы вообще не видно. И с этой тз представим что i вирт
| + | |
- | функция, из и можно получить доступ к приватной ф-ции i. Такое в C++
| + | |
- | запрещено.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">При множественном наследовании работают
| + | |
- | правла доступа, а не видимости.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Подход на уровне видимости давал бы
| + | |
- | отждественность i.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">При подзоде на уровне доступа возникает
| + | |
- | конфликт, ибо непонятно, а каком имени идёт речь.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Сначала определяют имена.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В модульных языках там естественным
| + | |
- | образом подход управления видимости.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Последнее замечание:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">полностью проблему защиты решить на
| + | |
- | уровне языка нельзя. Защита идёт не от взлома, а от дурака. Так как
| + | |
- | есть произвольный доступ. Можно преобразовать тип указателя
| + | |
- | неконтроллируемо. Ибо мы можем сделать структуру, у которй все поля
| + | |
- | открыты ,то можно преобразовать в неё и вперёд.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В Джаве-Си шарп преобразования
| + | |
- | контроллируемые. Поэтому просто так сделать нельзя.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">На уровне языка полностью защититься
| + | |
- | нельзя.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Если есть gets, то можно написать тест,
| + | |
- | который ламает программу. И язык, который позволяет функции типа
| + | |
- | gets, ненадёжен.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Инкапсуляция данных</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Подход, связанный с Логическим Модулем
| + | |
- | (ЛМ)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Для начала возьмём самы простой язык,
| + | |
- | Модула-2. Там единица защиты – весь тип.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Modukla-2</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">DEFINITION MODULE M</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> TYPE T = ...;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">...</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">END M.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">IMPLEMENTATION MODULE M;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">ENDM.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">полностью скрытый тип данных –
| + | |
- | OPAQUE, для него мы указываем только его имя. И видим только то, что
| + | |
- | описано в DefINITION.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">TYPE Stack</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> PROCEDURE Init(VAR S: Stack);</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> PROCEDURE Destroy(VAR S: Stack);</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> PROCEDURE Pop ...</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Скрытый ТД выглядит почти как АТД.
| + | |
- | Различия связаны с механизмом раздельной трансляции. В М2 библиотечне
| + | |
- | модули служат единицами компиляции. То есть нельзя вместе неск
| + | |
- | мобъявления и реализацию.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Для того, чтобы откомпилировать
| + | |
- | модульский файл, то нужно знать только модули, которые он
| + | |
- | импортирует.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">IMPORT P.name FROM P;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">IMPORT NAME;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Язык сконструирован так, что ему нужен
| + | |
- | только модуль определений.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Сразу возникает тривиальный вопрос –
| + | |
- | пишу IMPORT Stacks, и в этом модуле аоперделена некоторая перемменная</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">VAR S : Stacks.Stack; - сколько байтов
| + | |
- | отводить под S?</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Для тогро, чтобы упростить язык, срытый
| + | |
- | тип данных может быть либо указателем, либо совместимый с ним
| + | |
- | (INTEGER)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">х86 – дурацкая архитектура. Ни
| + | |
- | одного нормального приложения без ошибок там написано не было.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Это накладывает ограничение на
| + | |
- | реализацию стека.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В Модуле-2 есть файл, который
| + | |
- | называется IO. Там есть скрытый ТД файл, и там он – целое число
| + | |
- | – дескриптор.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Для стека можно сделать примерно точно
| + | |
- | также – завести таблицу стеков. И фактически, мы сами реализуем
| + | |
- | алгоритм распределения дин памяти. Поэтому чаще используется
| + | |
- | динамический.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Как следствие, к скрытым типа данных
| + | |
- | неявно применимы присваивание и сравнение на равенство-неравенство.
| + | |
- | Присваивание очень коварно.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Теперь понятно, что Init и Destroy тоже
| + | |
- | обязательны.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">//Лектоор говорил, что Модула-2
| + | |
- | заточена под 16-битные архитектуры, но при этом, из этой лекции
| + | |
- | следует, что интегер 32-битный.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В Обероне проблемы, связанные с этим,
| + | |
- | решены. Как в Обероне-2 скрыть?
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">TYPE Stack* =
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">RECORD</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> BODY: ARRAY N OF T;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> TOP: INTEGER;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">END;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">PROCEDURE PUSH*(...);</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В соответствующем модуле определений
| + | |
- | можно увидеть, что стек - пустая запись.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">DEFINITION Stacks;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">TYPE Stack* =
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">RECORD</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">END;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В С++ если исправить какой-нибудь хедер
| + | |
- | (поправить комментарий), который включается везде (например,
| + | |
- | stdafx.h), то это влечёт полный ребилд проекта. В Дельфы если
| + | |
- | исправить, то делается только ребилд модуля, там делается побитовое
| + | |
- | сравнение скомпилированного модуля.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Компилятор Оберона на Обероне –
| + | |
- | 4000 строк.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В Обероне, так как отказались от
| + | |
- | разделения опр и реализации то проблема исчезла.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Поскольку компилятор всё-таки знает
| + | |
- | структуру класса, то и ту же операцию присваивания можно сделать.
| + | |
- | Отменить её, кстати, нельзя.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Как проблему решали создатели языка
| + | |
- | Ада:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Там есть конструкция, которая полностью
| + | |
- | отвечает АТД.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В Аде полностью реализован РОРИ. Модуль
| + | |
- | и реализация могут быть разделены физически.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Приватный тип данных:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">type T is private;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> операции над Т;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">сразу какая проблема – как
| + | |
- | размещать память. Заметим, что если мы реализуем стек в виде записи,
| + | |
- | т в Аде есть приятная возможность:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">record</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> top : integer = 1;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">end record;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Инициализировать при размещении записи.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Возникает парадокс – с одной
| + | |
- | стороны надо скрыть структуру, с другой компиляторы надо видеть. Но
| + | |
- | это решается просто, так как скрывается структура от пользователя.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Выход – структура типа
| + | |
- | описывается в определении.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">package P is</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> type T is private;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> ...</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">private</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> определения всех приватных типов из
| + | |
- | Р</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">end P;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Все приватные типы должны быдь
| + | |
- | определны.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Эта приватная часть доступна только
| + | |
- | компилятору, но программист, даже если их и видит, использовать не
| + | |
- | может.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Стек:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">package Stacks is
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> type Stack is private;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> процедуры работы со стеком
| + | |
- | (заголовки);</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">private</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> type Stack is access;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> type LINK is record</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> b:T;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> next : Stack;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> end record;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> type Stack is access Link;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">end Stacks;</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Здесь все опр типов, необходимые для
| + | |
- | реализации.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Проблема:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Та же, если в случае когда нет
| + | |
- | разделение опред и реализ. Представим, что мы сменили реализацию. Что
| + | |
- | нужно в Модуле сделать, чтобы проект заработал снова:
| + | |
- | перекомпилировать полностью модуль стек и пересобрвть проект. В Аде:
| + | |
- | перекомпилировать всё, что использует соотв единицу компиляции.
| + | |
- | Везде, где есть объявление стека, нужно перетранслировать всё.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Побочным эффектом гибкости является
| + | |
- | необх перетрансляции.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Современные языки игнорируют проблемы,
| + | |
- | связанные с перетрансляцией. Архитектура совр языков (D, С#, J)
| + | |
- | настолько проста и органична, что транслируются они быстро.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Приватные ТД не совсем АТД, так как к
| + | |
- | ним применимы опреац присваивания и сравнения (если структура типа
| + | |
- | подразумевает эти операции). В Аде, в отличие от многих джругих
| + | |
- | языков, массивы и записи одного типа можно сравнивать, если к каждому
| + | |
- | элементу применимы такие операции. Если массив из Т, и к Т применимо
| + | |
- | сравнение, то и к массиву применимо сравнение. Аналогично и к записи.
| + | |
- | То есть обобщаются не только операции присваивания, но и сравнения.
| + | |
- | Также можно сравнивать на больше, меньше, больше равно, меньше равно.
| + | |
- | Но больше только если все элементы больше.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">А настоящий АТД – только явно
| + | |
- | определённые операции.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Но если мы хотим совсем
| + | |
- | абстрагироваться, то надо сделать limited private, к нему неприминимы
| + | |
- | ни присваивание, ни сравнение. Например, это полезно для ссылочных
| + | |
- | типов, чтобы делать при необх глубокое копирование. Ещё один пример –
| + | |
- | если нужна уникальность объекта.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Ограниченный приватный ТД –
| + | |
- | настоящий АТД.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Заметим, что больше никак защиту типа
| + | |
- | ослабить нельзя.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Тем самым Ада заставляет
| + | |
- | программировать в приватных или ограниченных приватных ТД. Аналогично
| + | |
- | в Модуле нужно использовать скрытые типы данных.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><B>Классовые ЯП</B></P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Там ни о какой видимости не идёт речь.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В Классовых ЯП речь идёт об управлении
| + | |
- | доступах, модификаторах.ю</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">С++:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">public – любая структруа имеет
| + | |
- | доступ
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">private – только члены класса</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">И тут речь об управлении доступ –
| + | |
- | мы видим приватные члены, но ничего с ними не можем сделать.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">protected – доступ членам и
| + | |
- | потомкам.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Эта схема достаточно простоа, но влечёт
| + | |
- | проблемы.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Например, некотрые операции хочется
| + | |
- | сделать внешними. Например, жвуместный плюс.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Такая модель либо предоставвяляет
| + | |
- | полный доступ из вне, либо полностью его закрывает. В нккотрых
| + | |
- | случаях это неудобно.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Решать эту проблему можно либо с
| + | |
- | помощью внутренних классов (iterator в STL – iterator -
| + | |
- | вложенный класс для каждого контейнера)</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В С++ эта проблекма решена с помощью
| + | |
- | механизма друзей. Функция-друг имеет полный доступ к внутренним
| + | |
- | членам. Друзья объявляются внутри класса. Но при этом друг моего
| + | |
- | друга не мой друг.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">С++ истинный наследник языка С, и етсь
| + | |
- | возможность меньше писать (друзей можно внутри класса не отлько
| + | |
- | объявлять, но и определять).</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Что такое АТД на С++ - публичными
| + | |
- | являются только функции-члены данного класса.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Абстрактный класс как может быть АТД,
| + | |
- | так может и не быть. Это ортогональные понятия.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В С++ присваивание неявно
| + | |
- | переопределяется, но присваивание можно переопределить и запретить.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Интерфейс – набор публичных
| + | |
- | членов. Но есть особое понятие интерфейса.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В совр ЯП (Джава, шарп, Дельфы). Подход
| + | |
- | похожий, но есть свои особые. Механизм публичных членов есть. Есть
| + | |
- | public, private, protected. Синтаксич сахар: в джаве и си шарп должны
| + | |
- | ставить модификатор перед каждым членом. Проблема друзей –
| + | |
- | технологическая.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">С# - namespace – пространства
| + | |
- | имён. Аналог джавовского пакета.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Во всех этих языках есть спец. Способ
| + | |
- | доступа: С шарп – internal, Джава – доступ по умолчанию.
| + | |
- | В Си шарп по умолчанию доступ приватный. В структурах по умоланию
| + | |
- | тоже. В джаве пакетный доступ – с тз доступа члены класса с
| + | |
- | пакетным доступом разрежается доступ из всех классов из того же
| + | |
- | пространства имён. Если в Си шарп перед классом стоит internal, то
| + | |
- | все члены доступны в перделах пространства имён. Аналогично в джае,
| + | |
- | если не указывать спецификатор доступа, и это логично.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Для класса в си шарп если стоит private
| + | |
- | перед классом, то это значит internal.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Модификатор доступа перед классом более
| + | |
- | сильный.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Java:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">import P.X</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">class X extends Y {</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> void F() - доступ к закрытым членам X</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">internal гарантирует, что чужой дядя со
| + | |
- | своими немытыми (грязными – 7:9) руками в мои члены не влезет.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">... соответствующий соответственно...</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">С тз ограничений доступа понятно, что
| + | |
- | означает internal protected – можно использовать в дочерних
| + | |
- | классах в пространстве имён.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">private -> internal protected ->
| + | |
- | internal -> protected -> public</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">В Джаве:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm">private -> (по умолчанию) ->
| + | |
- | protected -> public</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">Дельфи:</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> всё то же самое. Только умолчание
| + | |
- | хитрое.
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | <P STYLE="margin-bottom: 0cm">type X = class</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"> ... объявления членов без
| + | |
- | модификатора – у этих членов и только у них внутренний доступ.
| + | |
- | Для функций-членов из этого юнита они публичны.</P>
| + | |
- | <P STYLE="margin-bottom: 0cm"><BR>
| + | |
- | </P>
| + | |
- | | + | |
- | {{Языки Программирования}}
| + | |
- | {{Lection-stub}}
| + | |