лекции (2009), страница 2
Описание файла
Текстовый-файл из архива "лекции (2009)", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр 2 страницы текстового-файла онлайн
• Java (2005) - расширение Java, в том числе добавление перечислимых типов, оформленных в виде
полноценных классов
Смещение парадигмы программирования
1972 SmallTalk
1979 Си с классами
1983 Си++
1988 Turbo Pascal 5.5
Начало 90-х Всеобщая объектно-ориентированность
И т.д.
Результат смещения – появление «компонентов» - «чёрных ящиков» с «рычагами» (в их роли выступают
методы) и «лампочками» (в их роли выступают properties), уход от иерархий классов.
Таким образом, сегодня профессиональный программист пишет sealed(C#, для Java – «final») класс, т.е. класс,
от которого нельзя наследовать, если он является его собственным классом или не существует
исключительных причин делать иначе.
Возвратимся к перечислимым типам данных («к нашим баранам», как говорит Игорь Геннадивевич):
Вопросы, связанные с реализацией и использованием перечислимых типов данных:
• Проблема представления – реализовывать ли возможность задавать конкретные значения констант
(например, для цветов)?
• Проблема эффективности – реализовывать ли возможность управления представлением?
• Проблема преобразований в другие целочисленные типы данных – разрешать или не разрешать?
• Неявный импорт – разрешать или нет?
• Удобство использования – ввод, вывод и т.д.
Модула-2
type ET = (v1, …, vN);
Преобразования :
ord(x); ET -> integer
val(T,i); ET -> integer. Либо выдаёт ошибку, либо выдаёт значение.
val(ET,v2) = 1;
Неявный импорт возможен
Удобность использования не расширена.
С++ <-> C-89
enum ET{…};
void f(ET x);
void f(int x); Будет перегрузка, потому что перечисление – новый тип данных
В Си++ typedef задаёт синоним типа, а не создаёт новый тип.
typedef int a;
void f(a x)
void f(int x) Перегрузки не будет, т.к. «a» не новый тип(=> будет ошибка)
В Си++ можно задавать значения константам перечисления
Enum FileAccept
{
FileRead = 1;
FileWrite = 2;
FileReadWrite = FileRead | FileWrite;
}
Удобство использования такое же, как и для int
Ада
Типы BOOLEAN и CHARACTER являются перечислимыми типами данных из пакета
STANDARD
Проблема неявного импорта:
type SendColor is (Red,Yellow,Green)
type BasicColor is (Red,Green,Blue)
Ввели понятие «литерал» перечисления. Им является либо идентификатор, либо символ(‘символ’)
type Latin is (‘A’, ‘B’,’C’,… ,’Z’)
type ASCII Latin(‘A’, ‘B’,’C’,… ,’Z’, ‘a’, ’b’,…)
Литерал перечисления – функция без параметров, имя которой совпадает с литералом и
возвращает нужную константу
procedure P(x:SendColor)
procedure P(x:BasicColor)
P(Wellow) – в функцию отправится «1»
P(Red) - ?? ошибка
Решение проблемы неявного импорта:
Уточнение типа - T’expr – выражение expr трактовать как выражение типа Т
P(BasicColor’Red) – правильно!
Представление:
for BasicColor use (Red => FF00000x, Green => FF00x, Blue =>FFx)
for BasicColor’Size use 24; - 24- количество битов
«’» специальная операция, применимая именами типов, позволяющая получить доступ к
некоторым атрибутам
C#
Управление реализацией:
enum BasicColor
{
Red = 0xFF0000;
Green = 0xFF00
Blue = 0xFF
};
enum SendColor: Byte
{
Red;
Yellow;
Green;
};
Преобразования из перечислимых типов в целочисленные в современных языках только
явные.
Атрибуты – средства сообщать компилятору некоторую информацию о реализации типа.
[FLAGS] – указывает, что перечисление может обрабатываться как битовое поле, которое является
набором флагов.
[FLAGS]
enum FileAcces
{
FileRead = 1;
FileWrite = 2;
FileReadWrite = FileRead | FileWrite;
}
теперь, если вывести на экран FileAccept. FileReadWrite получим «FileRead, FileWrite». Без
использования атрибута [FLAGS] получим 3.
С#, Java
Неявный импорт
FileAcces x;
X = FileAcces.Read; //Уточнение перечисления
Удобство использования. Классы-обёртки
Классификация ТД
1. Java
• Простые Типы Данных
• Референциальные типы данных
• Классы
• Массивы
2. C#
• Типы-значения
• Классы – размещаются только в динамической памяти
Для каждого типа-значения существует класс-обёртка
С# int - Int32,bool – Boolean, long – Int64
Java int – Integer,bool – Boolean, long – Long
В С# все обёртки находятся в .Net
Для всех перечислений имеется один класс-обёртка – «Enum»
всем перечислениям доступны методы класса Enum ToString(), GetValues() и т.д.
int [] vals = (int []) Enum.GetValues(typeof(…));
Java v5.0 Tiger 2005
Enum SendColor
{
Red,Yellow,Green //Статические члены
}
SendColor c = SendColor.Red;
В Java v5.0 константы перечисления - статические члены класса, находящиеся в классе и
представляющее собой значения класса. Упорядочены. Значения задавать нельзя.
SendColors.valuesof();
.ordinal();
.value(“Red”) // -> 0
enum Apples
{
….
Apple4(10); /// Каждое значение перечислимого типа должно быть со своей ценой
….
int price;
public Apples(int p)
{
price = p;
}
public void set_price(int p){…}
public int get_price(){….}
}
…..
Apples x = Apples.Apple4; // можно писать без «new». Это исключение для перечислений
// Apples.Apple4 – значение класса, а не поля класса
Объекты перечислений нельзя копировать.
Наследование от перечислений запрещено.
п2.4.2 Диапазоны
Паскаль
var
x: L..R;
Модула 2
var
x: [0..N];
y: CARDINAL[0..N];
i:INTEGER;
j:CARDINAL;
x := 0; Проверки не будет
x := i; Вставка квазистатической проверки, если нельзя вычислить i
x := y; Проверки не будет.
Напомню, что переменные типа CARDINAL могут принимать значения от 0 до 65535, а INTEGER
от -32768 до 32767 (для 16-ти битных компиляторов)
Ада
Type Diap is range 0..N;
Type Pos is new INTEGER range 0..MAX_INT; новый тип данных.
….
I:integer;
Y:Pos;
Y := I; компилятор вставит сообщение об ошибке, т.к. это разные типы данных
(из-за «new»)
Y:=Pos(I); Вставка проверки на знак
Subtype Natural is range 1..MAX_INT;
J:Natural
………
I := J; Проверки не будет
J := I; В этой строчке будет проверка
Ни в одном из современных языков программирования нет типов-диапазонов, т.к. современных языках чётко
определены индексы массив: 0 <= i <= N-1, а основной областью применения диапазонов было именно
задание типов индекса массива.
п.2.5 Указатели и ссылки
Адрес :
• Указатель
• Имя