Редактирование: Языки программирования, 20 лекция (от 16 ноября)

Материал из eSyr's wiki.

Перейти к: навигация, поиск

Внимание: Вы не представились системе. Ваш IP-адрес будет записан в историю изменений этой страницы.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.

Текущая версия Ваш текст
Строка 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) &ndash;
+
-
есть управление видимостью.</P>
+
-
<P STYLE="margin-bottom: 0cm">В ОО языках &ndash; управление
+
-
доступом.</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 &ndash; виртуальная
+
-
функция. Если 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. Там единица защиты &ndash; весь тип.</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">полностью скрытый тип данных &ndash;
+
-
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">Сразу возникает тривиальный вопрос &ndash;
+
-
пишу 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 &ndash; дурацкая архитектура. Ни
+
-
одного нормального приложения без ошибок там написано не было.</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. Там есть скрытый ТД файл, и там он &ndash; целое число
+
-
&ndash; дескриптор.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Для стека можно сделать примерно точно
+
-
также &ndash; завести таблицу стеков. И фактически, мы сами реализуем
+
-
алгоритм распределения дин памяти. Поэтому чаще используется
+
-
динамический.
+
-
</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">Компилятор Оберона на Обероне &ndash;
+
-
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">сразу какая проблема &ndash; как
+
-
размещать память. Заметим, что если мы реализуем стек в виде записи,
+
-
т в Аде есть приятная возможность:</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">Возникает парадокс &ndash; с одной
+
-
стороны надо скрыть структуру, с другой компиляторы надо видеть. Но
+
-
это решается просто, так как скрывается структура от пользователя.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Выход &ndash; структура типа
+
-
описывается в определении.</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">А настоящий АТД &ndash; только явно
+
-
определённые операции.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Но если мы хотим совсем
+
-
абстрагироваться, то надо сделать limited private, к нему неприминимы
+
-
ни присваивание, ни сравнение. Например, это полезно для ссылочных
+
-
типов, чтобы делать при необх глубокое копирование. Ещё один пример &ndash;
+
-
если нужна уникальность объекта.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Ограниченный приватный ТД &ndash;
+
-
настоящий АТД.</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 &ndash; любая структруа имеет
+
-
доступ
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">private &ndash; только члены класса</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">И тут речь об управлении доступ &ndash;
+
-
мы видим приватные члены, но ничего с ними не можем сделать.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">protected &ndash; доступ членам и
+
-
потомкам.</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 &ndash; 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">Интерфейс &ndash; набор публичных
+
-
членов. Но есть особое понятие интерфейса.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">В совр ЯП (Джава, шарп, Дельфы). Подход
+
-
похожий, но есть свои особые. Механизм публичных членов есть. Есть
+
-
public, private, protected. Синтаксич сахар: в джаве и си шарп должны
+
-
ставить модификатор перед каждым членом. Проблема друзей &ndash;
+
-
технологическая.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">С# - namespace &ndash; пространства
+
-
имён. Аналог джавовского пакета.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">Во всех этих языках есть спец. Способ
+
-
доступа: С шарп &ndash; internal, Джава &ndash; доступ по умолчанию.
+
-
В Си шарп по умолчанию доступ приватный. В структурах по умоланию
+
-
тоже. В джаве пакетный доступ &ndash; с тз доступа члены класса с
+
-
пакетным доступом разрежается доступ из всех классов из того же
+
-
пространства имён. Если в Си шарп перед классом стоит 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 гарантирует, что чужой дядя со
+
-
своими немытыми (грязными &ndash; 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 &ndash; можно использовать в дочерних
+
-
классах в пространстве имён.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">private -&gt; internal protected -&gt;
+
-
internal -&gt; protected -&gt; public</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
<P STYLE="margin-bottom: 0cm">В Джаве:</P>
+
-
<P STYLE="margin-bottom: 0cm">private -&gt; (по умолчанию) -&gt;
+
-
protected -&gt; 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"> ... объявления членов без
+
-
модификатора &ndash; у этих членов и только у них внутренний доступ.
+
-
Для функций-членов из этого юнита они публичны.</P>
+
-
<P STYLE="margin-bottom: 0cm"><BR>
+
-
</P>
+
-
 
+
-
{{Языки Программирования}}
+
-
{{Lection-stub}}
+

Пожалуйста, обратите внимание, что все ваши добавления могут быть отредактированы или удалены другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. eSyr's_wiki:Авторское право).
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

Личные инструменты
Разделы