Структурное программирование:
декомпозиция по задачам
человек мыслит иначе, объектами
декомпозиция по объектам
Объектом можно назвать то, что имеет чёткие границы и обладает состоянием и поведением.
Состояние определяет поведение:
лежачий человек не прыгнет
незаряженное ружье не выстрелит
Класс – это множество объектов, имеющих общую структуру и общее поведение.
Метод – это процедура или функция, принадлежащая классу объектов.
Схема определяет
Класс
Данные
Методы
отличие от структур!
состояние
поведение
Поле – это переменная, принадлежащая объекту.
TRoad road;
road.Length = 60;
road.Width = 3;
Попытка изменить данные:
private
ошибка
Основная программа:
public:
TRoad road;
вызов конструктора
road.Length = ???
road.Width = ???
«мусор»
Класс:
TRoad();
TRoad::TRoad()
{
Length = 0;
Width = 0;
}
Конструктор:
TRoad::aaa()
{
...
}
метод aaa класса TRoad
TRoad::TRoad ( float length0, int width0 )
{
Length = length0;
Width = width0;
}
Конструктор:
Вызов:
TRoad road ( 60, 3 );
Вызов:
TRoad road ( 60 );
= 3
значение по умолчанию
последние в списке параметров
width = 3
дорога, по которой едет
координата, скорость
полоса
защита от ошибок – самостоятельно
TCar::TCar ( TRoad *road0, int p0,
float v0 )
{
Road = road0;
P = p0; V = v0; X = 0;
}
Равномерное движение:
перемещение за одну единицу времени
выезжает с другой стороны
обращение через указатель
пока не нажата (любая) клавиша
#include
for ( i = 0; i < N; i ++ )
cars[i]->move();
массив указателей
создание объектов
неэффективно для небольших задач
ООП – это метод разработки больших программ!
Инкапсуляция («помещение в капсулу») – скрытие внутреннего устройства объектов.
Пример: класс «перо»
class TPen
{
private:
string FColor; // цвет, "FF00FF"
};
R
G
B
Field – поле
string getColor ();
void setColor ( string newColor );
методы доступа
Записать значение:
void TPen::setColor ( string newColor )
{
if ( newColor.length()!= 6 )
FColor = "000000";
else FColor = newColor;
}
если ошибка, чёрный цвет
установить цвет
прочитать цвет
pen.color = "FFFF00";
cout << pen.color;
нельзя в C++
Удобнее хранить цвет в виде числа:
string getColor();
void setColor( string newColor );
int
изменилось внутреннее устройство
читаем строку
подключить строковые потоки
stringstream s;
s << hex << FColor;
"0000FF"
правильно так!
16711935
"FF00FF"
Преобразования hex ↔ int
#include подключить манипуляторы заполнять не пробелами, а нулями вывести 6 знаков прочитать строку string из потока
#include
Использование потока:
16711935
"FF00FF"
записываем в поток строку
читаем число в шестнадцатеричной системе
записываем строку
читаем число
Доступ с помощью методов:
TPen pen;
pen.setColor ( "FFFF00" );
cout << "цвет пера: " << pen.getColor();
Доступ с помощью свойства color:
TPen pen;
pen.color = "FFFF00";
cout << "цвет пера: " << pen.color;
вызов pen.setColor
вызов pen.getColor
метод чтения
метод записи
закрытое поле
открытое свойство
Использование:
TPen pen;
pen.color = "FFFF00";
string s = pen.color;
переданное значение
в строку
шестнадцатеричныйформат, 6 знаков
в целое
из шестнадцатеричной записи
переданное значение
нет метода записи
Скорость машины можно только читать:
class TCar {
private double Fv;
public double V {
get { return Fv; }
}
};
Свойство на C#:
Фрукт
классы-наследники
это фрукт,
у которого…
наследует свойства (имеет все свойства)
Класс Б является наследником класса А, если можно сказать, что Б – это разновидность А.
яблоко – это фрукт
машина – двигатель
яблоко – фрукт
горный клевер – клевер
горный клевер – это растение рода Клевер
машина содержит двигатель (часть – целое)
можно моделировать элементы с памятью (триггеры)
вычислить выход
только для чтения
void TLogElement::calc()
{
}
заглушка
class TLogElement
{
...
protected:
void calc();
};
защищённые элементы: доступны только наследникам
наследники будут изменять поле
virtual
= 0;
наследники будут изменять поле
virtual
= 0;
для элементов с одним входом не нужно!
virtual (виртуальный) – этот метод могут переопределять классы-наследники
= 0 (абстрактный метод) – этот метод базовый класс не будет реализовывать (оставляет наследникам)
Абстрактный класс – это класс, содержащий хотя бы один абстрактный метод.
все логические элементы должны иметь метод calc
метод calc невозможно написать, пока неизвестен тип логического элемента
нет логического элемента «вообще», как не «фрукта вообще», есть конкретные виды
TLogElement – абстрактный класс из-за метода calc
void TNot::calc()
{
FRes =!getIn1();
}
наследник от TLogElement
переопределяет метод базового класса
наследник от TLogElement
повысить «видимость» (protected → public)
нельзя, он абстрактный
сохранить права доступа
элемент «И»
элемент «ИЛИ»
элемент «И»
элемент «ИЛИ»
доступ к защищённому полю (protected)
В базовом классе:
class TLogElement
{
protected:
virtual void calc()= 0;
...
};
virtual
Статическое связывание:
транслятор записывает в код адрес процедуры
Динамическое связывание:
адрес процедуры определяется во время выполнения программы в зависимости от типа объекта
Идея: выделить классы в отдельный модуль.
Интерфейс (log_elem.h):
#include Модуль (log_elem.cpp): реализация методов классов В основную программу: #include
адрес следующего элемента в цепочке
номер входа следующего элемента
Установка связи:
После изменения выхода «дергаем» следующий элемент:
если следующий элемент установлен…
передать результат на нужный вход
Изменения в основной программе:
elAnd.Link ( &elNot );
установить связь
это уже не нужно!
Сообщение – это блок данных определённой структуры, который используется для обмена информацией между объектами.
адресат (кому) или широковещательное
числовой код (тип) сообщения
параметры (дополнительные данные)
нажатие на клавишу
щелчок мышью
перемещение окна
поступление данных из сети
запрос к веб-серверу
завершение вычислений
…
Этапы разработки:
Форма – это шаблон, по которому строится окно программы или диалога
выполняются при возникновении событий
c 1995 по н.в.: Microsoft
объединение программ на разных языках
полностью ООП – для больших программ
большая библиотека функций и компонентов
требовательна к ресурсам
надёжно – только под Windows
Linux – проект Mono
проект (.csproj, CSharp Project) – описание (XML)
модули, из которых состоит программа (*.сs);
ресурсы (*.resx) – строки (перевод сообщений).
Проекты и решения
Program.cs
Form1.Designer.cs
Form1.cs
my.exe
основная программа
обработчики событий
ресурсы
описание формы
Решение = один или несколько проектов.
Структура проекта
библиотеки
пространство имён
конструктор
открытый класс
частичное описание
наследник класса Form
начальные установки
библиотеки
статический класс
создание формы
запуск цикла обработки сообщений
MainForm
закрытый метод класса MainForm
название обработчика
общий предок всех объектов
кто послал сообщение
дополнительные данные о событии
тип: результат диалога
Диалог с вопросом
Метод MessageBox.Show:
нажали «Нет», отменить закрытие
если файл выбран
имя файла
2×ЛКМ
из строки в число
построить цвет
в шестнадцатеричную систему, 2 знака
private void MainForm_Load (
object sender, EventArgs e )
{
rEdit_TextChanged ( null, null );
}
пустой объект
вызывающий объект – rEdit (здесь – всё равно!)
rgbLabel.Text = "?";
если ошибка, записать "?"
Backspace
выделить все три (+Shift)
обработка завершена
это цифра
class IntTextBox: TextBox
{
}
Проект – Добавить класс
using System.Windows.Forms;
там объявлен TextBox
только для наследников
перекрыть метод базового класса
base.OnKeyPress(e);
вызвать метод базового класса
общедоступное свойство
число в строку
из строки в число
Использование:
метка hexLabel
Label
поле ввода decEdit
IntTextBox
свойство
в шестнадцатеричную
Модель:
символьная строка
алгоритм вычисления:
k = номер последней операции
n1 = значение левой части
n2 = значение правой части
результат = операция(n1, n2)
функция LastOp (глава 6)
Псевдокод:
Проект – Добавить класс
приоритет операции
последняя операция
вычислить
<=
вернёт номер символа
Name = Input
Dock = Top
if ( нажата клавиша Enter )
{
x = значение выражения
добавить результат в конец поля вывода
if ( выражения нет в списке )
добавить его в список
}
KeyPress для элемента Input:
if ( e.KeyChar == (char)13 )
{
...
}
код клавиши Enter
Вычисления (обращение к модели):
Answers.Text += Input.Text + "=" +
x.ToString() + "\r\n";
Добавление строки в TextBox:
добавить строку
число в строку
новая строка
Добавление строки в ComboBox:
Input.Items
вставить строку
найти индекс строки
массив строк в ComboBox
позиция списка
что вставлять
KeyPress для элемента Input:
Если не удалось найти и скачать презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:
Email: Нажмите что бы посмотреть