лекции (2011), страница 5
Описание файла
Документ из архива "лекции (2011)", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Онлайн просмотр документа "лекции (2011)"
Текст 5 страницы из документа "лекции (2011)"
Модуль-ресурсы = ОД, ТД, П/П.
Интерфейс = определение ресурсов + реализация.
Пространство имен в ООЯП заменено на модули.
М-2:
1)Главный модуль //Один
2)Библиотечный модуль
3)Локальный модуль //параллельное программирование.
Глобальное пространство имен => видимость для всех
Непосредственная видимость: имя использует ASIS.
Потенциальная видимость: имя с уточнением.
DEFINITION MODULE имя;
Определение ресурсов.
END имя;
IMPLEMENTATION MODULE имя;
Реализация всех процедур/функций из DEF + дополнительные ресурсы.
END имя;
TP, DELPHI:
init имя;
interface
…
implementation
End имя;
Все имена экспортируются в глобальное пространство имен ПОТЕНЦИАЛЬНО.
IMPORT M; //Первые в модуле => клиент.
IMPORT InOut; //Видимы потенциально.
InOut.WriteString(“counter”);
InOut.WriteInt(out);
InOut.Writeln;
FROM InOut Import Writeln, WriteInt.
Видны непосредственно!
uses список имен; //видимы непосредственно.
Оберон: оставлен только библиотечный модуль.
MODULE M;
…
ENDM;
* - экспорт имени.
//имя *
MODULE ST
TYPE STACK* = …
PROCEDUR PUSH* (VAR S: STACK); … PROCEDURE P…
END. => псевдомодуль.
DEFINITION ST;
TYPE STACK = …
PROCEDURE PUSH = …
END st.
=> IMPORT список_имен_модулей.//В Обероне только так.
=> ST.STACK //интерфейс.
Или FROM ST IMPORT R; => R//реализация.
Ада: пакет(спецификация, тело)
Спецификация:
package M is
Определение типов, переменных, констант, заголовков процедур
end M;
Тело:
package body M is
Реализация всех процедур и функций
end M;
package STANDART; //пакет стандартных имен.
Пользовательские пакеты встраиваются в STANDART.
Для подключения пакета используется оператор with: with <Имя пакета>. В случаях,
когда использование полной точечной нотации для доступа к ресурсам пакета обременительно, можно использовать инструкцию спецификатора использования контекста use. Это позволяет обращаться к ресурсам которые предоставляет данный пакет без использования полной точечной нотации, так, как будто они описаны непосредственно в этом же коде. Для обращения к функции из пакета используется оператор «.»: <имя пакета>.<имя функции>
Любой пакет можно вложить в другой.
STANDART
package M1 is
package M1.2 is
…
end M1.2; end M1;
package M2 is
package M2.1 is
package M2.2 is
…
end M2.2; end M2.1; end M2;
Тела вкладываются также, как и спецификации!
Более близкое описание скрывает менее близкое описание одинаковых имен. Как только возникает конфликт имен, имя становится видимым только через уточняющую форму, и непосредственная видимость исчезает.
Область действия любого имени начинается с его определения. Имена пакетов видимы непосредственно в той области, где они были объявлены.
В пакете М1 видимость обьектов из М12 потенциальная. А из внутренней области видимости мы имеем непосредственный доступ во все объемлющие структуры.
Неявный импорт: вместе с одним именем неявно импортируется другое.
переименование:
a renames b; //a теперь описано уже тут
Можно также переименовать операцию «+»:
function “+”(X, Y: vectors.Vector) return vector renames vectors;
Ада, Модула - 2 предоставляет программисту возможность осуществлять переименования. Переименование не создает нового пространства для данных. Оно просто создает новое имя для уже присутствующей сущности.
В С# using
В Java import имя_пакета;//ошибка-нельзя экспортировать пакет в Java!
import имя_класса; //Ok!
import имя_пакета.* ;//Ok! – мы импортируем все имена из пакета
В Pascal, Delphi uses
В Оберон 2 переменную можно экспортировать только на чтение.
1.Сравните между собой конструкции "uses" в языке Delphi и "use" в
языке Ада (для чего применяются, сходства, отличия).
Конструкция языка Delphi «uses список_имен_модулей» служит для импорта всех имен, объявленных в интерфейсе модулей из списка. При этом импортированные имена становятся непосредственно видимыми (если нет конфликтов с именами из других модулей).
Конструкция языка Ада «use список_имен_пакетов» обеспечивает непосредственную видимость имен из спецификаций пакетов из списка (если нет конфликтов).
Сходство: конструкции обеспечивают непосредственную видимость имен из интерфейсов (спецификаций) при отсутствии конфликтов.
Различие: в Delphi «uses» импортирует имена из интерфейсов библиотечных модулей, в Аде импорт имен обеспечивается другими конструкциями, а «use» служит только для разрешения непосредственной видимости.
Модульность и технология программирования: проектирование
«сверху-вниз» и «снизу-вверх».
Существует два подхода к проектированию древовидной иерархии модулей:
-
сверху вниз(top-down- подход) - сначала проектируется модуль верхнего уровня, а затем мы опускаемся до более низких уровней.
-
снизу вверх(bottom-up- подход) – сначала проектируются самые нижние модули – они в данной иерархии инкапсулированы и ничего не знают о вышестоящих модулях. Подставляют виртуальные сервисы универсального характера, которые нужны всем.(P. S. Современные объектно-ориентированные системы в данном случае предлагают нам сетевые структуры.) на их базе строятся сервисные модули более высоких уровней – и так далее, пока не дойдем до единого главного модуля всей системы. Недостаток такого подхода: мы никогда точно не знаем, что нам понадобится в будущем.
Понятие класса. Класс как тип данных. Члены класса: функции,
данные. Статические и нестатические члены. Члены - вложенные классы.
Принципиальное отличие класса от модуля заключается в том, что класс – это тип данных, а модуль нет. Но во многих вещах они похожи.
Тип Данных = Структура Данных + Множество Операций над этими данными
В C#, Java всё является классами или находится в классах в качестве статических челнов.
синтаксис в C++.Java,C#:
class Name
{
….
Определение членов класса
…..
}
В Си++ допускается вынесение определений, т.е. В Си++ можно члены класса лишь объявлять. В Java, C# все определения должны быть внутри класса
Java,C#,
T x;
x = new T(«параметры конструктора»);
В первой строчке определяется ссылка на объект (выделяется память для хранения ссылки), место в динамической памяти под объект не отводится. Во второй непосредственно отводится место в динамической памяти («куче») для объекта и адрес
присваивается ссылке на объект.
C++.
T x;
T x(«параметры конструктора»);
T x = T(«параметры конструктора»);
В этих определениях выделяется место не под ссылку на объект, а под сам объект (не в динамической памяти). Чтобы выделить место в динамической памяти, нужно использовать операцию «new»
синтаксис в Delphi:
type T =
class (наследование)
обявление членов класса
end;
Члены класса:
• Члены-данные
• Члены-типв
• Члены-функции (методы)
Чем члены-функции отличаются от обычных функций?
Такой функции при вызове всегда передаётся указатель «this»(в Delphi «self») на объект в памяти, от имени которого вызывается функция.
Dephpi
x : T
x – ссылка, её ещё надо проинициализировать.
В Delphi формальные параметры функций-членов находятся в той же области видимости, что и все остальные члены класса и, следовательно, не могут с ними совпадать.
В Delphi членов-типов нет.
Статические члены
SmallTank class variable
instance variable
class variable – члены-данные класса, которые принадлежат всем экземплярам класса.
instance variable – принадлежат экземплярам класса, у экземпляра своя instance variable.
С точки зрении Си++ статические члены классов отличаются от глобальных только областью видимости.
class T
{
….
static int x;
static void f();
……
}
…
T t;
t.x;//операция доступа
T::x//операция разрешения видимости
t.f();//операция доступа
//или, что тоже самое
T::f() //операция разрешения видимости
Более того, статическим члены данные могут существовать даже тогда, когда нет ни одного экземпляра класса.
Видимость статических членов потенциальная и снять ее, в отличие от модулей, нельзя.
В C#,Java,Delphi обращение к статическим членам происходит только через тип класса.
В статических функциях нет ths/self => в них нельзя использовать нестатические члены класса, т.к. по умолчанию все обращения к нестатическим членам идут через указатель ths/self
В C#, Java статические члены используются намного чаще, чем в Си++, Delphi, т.к. в C#, Java нет глобальных функций и переменных:
public class Name
{
….
public static void Main(string [] args)
….
}
Вложенные типы данных (классы)
class Outer
{
….
class Inner //Inner – обычный класс, но с ограниченной областью
{ //видимости
…..
};
….
};
Наибольшее сходство между классом и модулем достигается если класс содержит только статические методы и поля. При этом такой класс, как правило, реализуется в виде модуля. Статические и нестатические классы. Классы и области видимости.
Все классы являются статическими членами. Ко всем именам правила прав доступа применяются одинаково, т.е. специфика имени не участвует в разрешении прав доступа.
C#
В C# имеется понятие «статического класса»
В C# статический класс – это особый вид класса, внутри которого есть только статические члены-функции и только статические члены-данные.
static class Mod
{
public static void f () { ….;}
public static int i;
}
Статический класс – служит контейнером для статических членов. От статических классов нельзя наследовать. Статические члены – это переменные, которые принадлежат классу целиком.
Нельзя создавать объекты статических классов. Статические классы подчёркивают их чисто модульную природу.
Без «static» - обычный класс в понятии Си++. На вложенность классов не влияет.
Статические члены – набор ресурсов, независимых от какого-либо экземпляра.
Java
Статический импорт – импорт всех статических членов класса. Часто применяется к математическим функциям.
Статические классы в Java:
public class Outer
{
….
public static class Inner //Тоже самое, что и в C#, C++ без «static»
{
…..
};
….
};
Это сделано для того, что доступ к Inner был через Outer
Декларируются внутри основного класса и обозначаются ключевым словом static. Не имеют доступа к членам внешнего класса за исключением статических. Может содержать статические поля, методы и классы, в отличие от других типов внутренних классов в языке Java.
Внутренние классы в Java: без «static»
Декларируются внутри основного класса. В отличие от статических внутренних классов, имеют доступ к членам внешнего класса, например «Outer.this». Не могут содержать определение (но могут наследовать) статических полей, методов и классов (кроме констант).
Понятие специальных функций-членов. Проблема инициализации
объектов и способы ее решения. Конструкторы, деструкторы, операторы
using и try-finally.