Компилятор генерирует свою версию функции для каждого нового числового типа данных (компилятор не обнаружит ошибки, если нет вызова функции)
Шаблон класса.
//класс Class IntList
{ Public:
List();
SetItem(int index, const int &Item);
GetItem(int index, int &Item);
Private:
Int Buffer[100]; };
//шаблон класса
template <Class T, int I> class CList
{ Public:
SetItem(int index, const T &Item);
GetItem(int index, T &Item);
Private: T Buffer[I];
};
В данном случае T – параметр типа, а I – параметр- константа типа int. Параметры устанавливаются при создании экземпляра класса.
CList <int, 100> IntList;
CList <double, 50> *DoubleList;
DoubleList = new CList <double, 50>;
Объектно-ориентированные особенности языка Java. Классы в Java. Применение интерфейсов и пакетов в Java. Динамическое определение типов (RTTI). Необходимость в динамическом определении типов. Применение метаклассов для получения динамической информации об объекте.
- архитектурно-нейтральный и переносимый компилятор генерирует байт-код, кот. Не зависит от ОС. Для выполнения необходима виртуальная машина – JVM.
- есть механизм безопасности, автоматизирована работа с памятью (сборщик мусора), настраиваемая безопасность работы с аплетами.
- в большинстве случаев выполнение не пошаговое, а с предварительной компиляцией (Just In Time – компиляторы, некот. JVM включают Hot Spot компиляторы, т.е. компилится только части байт-кода, критичные ко времени)
Типы приложений:
- аплеты – работают в среде WEB-браузера, урезана часть функций (работа с файлами, вызов системных функций)
- сервлеты – исполняются на серверах приложений (Tomcat)
- портлет – часть окон браузера, кот. имеет свой обработчик на сервере
- хранимые процедуры для работы с БД
- обычные приложения
Всякий класс – наследник класса object
Кроме 4 групп типов всё представляется в виде объектов:
- Целые числа (byte, short, int, long)
- Вещественные числа (float, double)
- Символьный тип (char)
- Логический (boolean)
Шаблон класса
[модификаторы класса] class <имя класса> [extends <суперкласс>] [implement <список интерфейсов>]
{
<поля класса>
<блоки инициализации>
<конструкторы>
<реализация методов>
<встроенные классы>
}
Модификаторы класса:
[public] – класс доступен в любом месте программы (в любых пакетах), если не указан, то только в текущем пакете
[abstract] – не может быть создано экземпляров этого класса
[final] – не может быть наследников
Модификаторы доступа к полям:
public – общедоступный
protected – только из текущего и наследника
private – только из текущего
Модификаторы полей:
static – статическое поле
final – неизменяемое поле
ptransient – поле не сохраняется при сериализации объекта. Сериализация – сохранение экзепляра класса в файла на диск.
final – невозможно переопределять метод в наследниках
abstract – метод не реализуется, а только объявляется
native – метод реализован как внешняя библиотека в целевой платформе
synchronized – объект блокируется при работе с методом
в Java можно строить одни конструкторы на основе других
class Point
{
Point()
{ this(0, 0); }
}
Интерфейсы как полностью абстрактный класс, т.е. только описание сигнатуры методов без реализации. Интерфейс – заготовка класса. Шаблон interface <Имя> {<описание сигнатуры>}
Назначение интерфейса – описание некот. протокола взаимодействия между классами. Интерфейс используется как обычный абстрактный класс. Возможно наследование интерфейсов как и клаcсов.
Java позволяет создавать классы наследники, предок – суперкласс.
class Point3D extends Point {…}
overloading – определение с другой сигнатурой
overdiniry – замещение в классе наследнике
Для невозможности замещения в наследниках использовать final.
Автоматическая очистка памяти (сборщик мусора), когда на объект не остаётся ссылок он уничтожается, что бы уничтожить a = null.
Пакеты – аналог пространства имён, если не указать пакет, то классы попадают в безымянный пакет.
Динамическое определение типов RTTI.
RTTI для:
1) проверка типа объекта при выполнении программы
2) Использование метаклассов
3) Использование оператора instanceof – позволяет определить принадлежность объектов к некот. типу
Основная идея – определить точный тип объекта обладая ссылкой на базовый тип. При выполнении программы проверяется тип объекта.
Object o = new Circle();
--------
((Circle) o).draw();
Метаклассы позволяют получать информацию о типах во время выполнения программы. Метакласс хранит в себе информацию о классе. Для каждого класса в проге есть свой метакласс. Информация о каждом классе сохраняется в файл <имя класса>.class. Во время выполнения проги JVM проверяет загружен ли метакласс для этого класса, если нет, то ищется соответствующий файл и загружается в память (проги на Java загружаются неполностью). Если метакласс загружен, то используется при создании.
Class.forName(“Class1”) позволяет загрузить метакласс с этим именем и возвращает ссылку на объект типа класса (на метакласс). Загрузка без создания экземпляра.
Получение ссылки на метакласс: Class c2 = Class2.class // Class2 обычный тип.
Второй метод безопаснее, так как наличие метакласса проверяется при компиляции.
Возможно получение информации о полях, методах, конструкторах, родительских классов.
Контейнеры:
1)коллекции – группа произвольных элементов, List – список, хранение разных элементов, Set – множество, список не повторяющихся элементов
2)таблицы – набор пар значений: ключ и !!! ещё чего-то
6. Объектно-ориентированные особенности языка C#. Классы в C#. Пространства имен в C#. Свойства, индексаторы, типы-делегаты в языке C#. Унифицированная система типов в языке C#
C# – основной язык при разработке программ для MS .NET. Полностью объектно-ориентированный. Обеспечивает полный контроль и безопасность чем Java и C++.
Класс – набор свойств, методов и событий, объединённых в единое целое.
Описание классов не отличается (или не сильно отличается) от написания классов на C++ и Java, единственное отличие от С++ нет глобальных функций и глобальных переменных в чистом виде.
Пространство имён (namespace) – логическая структура для организации имён, используемых в приложении. Основное назначение – предупредить возможные конфликты между именами в разных сборках. (Полное название пространства имени + название класса должно быть уникально для одного приложения). В том числе и при использовании динамически подключаемых библиотек (сборок).
Свойства – скрывают обращения к методу класса под обращение к полю (методы get и set). Чаще используются в системах визуального программирования, когда при изменении поля класса необходимо выполнить какие-нибудь дествия.
public class Class1
{ private string m_str;// поле
---------
public string str// свойство
{ get
{ return m_str; }
set
{ if (value != null)
{ m_str = value; } } } }
Индексаторы – элементы классов (структур, интерфейсов), позволяют обращаться с объектами класса как с массивами.
public class BitSet
{
private int m_bits;// поле
---------
public bool this[int i]// свойство
{get
{ if ((0 <= i) && (i < 32))
{ return ((m_bits & 1 << i) != 0); }
Else { return false; }
} set
{ if ((0 <= i) && (i < 32))
{ if (value)
{ bits |= 1 << i; }
Else { bits &= ~ (1 << i); } // стираем i-ый бит
}}}}
BitSet b = new BitSet();
b[2] = false; b[3] = true;
Тип – общий термин, который может относиться к классам, структурам, интерфейсам, перечислениям и прочему.
Делегаты – это безопасный для типов эквивалент указателя на функцию в C. Однако между ними есть и существенное отличие. Делегат C# - это уже не просто адрес в оперативной памяти, а класс, произвольный от базового класса MulticastDelegate. Делегаты очень близки в тех ситуациях, когда нужно, чтобы одна сущность передела вызов другой сущности.
Делегат выполняет те же функции, что и указатель на функцию, но гораздо более безопасными лучшими способами. При создании делегата указывается не только имя метода, но и набор передаваемых функции параметров (если есть), возвращаемое функцией значение.
public class Employee
{ private bool isWorking;
public Employee()
{ isWorking = false; }
public bool Working
{ get
{ return isWorking; }
set
{ isWorking = value; }
}
public delegate void EmpDelegate(Employee e);
}
public class Company
{ ArrayList Employees = new ArrayList();
public Company()
{ Employess.Add(new Employee("Иванов И.И."));
-------}
/// <summary>
/// групповая обработка сотрудников
/// </summary>
/// <param name="proc"></param>
public void ProcessEmployees(Employee.EmpDelegate proc)
{ foreach (Employee e in Employees)
{ proc(e); } // вызов метода
}
}
/// <summary>
/// демонстрации работы делегата
/// </summary>
public class TestApp
{ public static void Employ(Employee e)
{ if (e.Working)
{ Console.WriteLine("Уже принят"); }
else
{ e.Working = true;
Console.WriteLine("Сотрудник принят");
}
public static void Main()
{ Company c = new Company();// принять всех сотрудников компании
Все типы данных рассматриваются как объекты и являются производными от класса System.Object. даже примитивные (int, double, string и так далее). Класс System.Object определяет общее полиморфическое поведение для всех типов данных.