Переопределение (перегрузка) методов
Скажу несколько слов о такой «полезной вещи» как перегрузка (переопределение) методов (methods overloading) — в русскоязычной литературе принят дословный перевод — перегрузка, но лично я предпочитаю говорить — переопределение, что снимает множество вопросов новичков. Что это такое? Это возможность создать несколько вариантов одного и того же метода, отличающихся набором параметров. В качестве примера используем конструктор нашего любимого класса «Черный ящик». Например в одном случае мы хотим сразу же при создании нового экземпляра класса (черного ящика) вырезать название и поместить в него содержимое, а в другом случае мы хотим только вырезать при создании ящика его название, а содержимое поместить потом. В данном случае, какой путь вы изберете, не принципиально, а зависит только от вашего желания и удобства в каждом конкретном случае.
Public Sub New(ByVal NewName As String)
Public Sub New(ByVal NewName As String, ByVal NewContent As String)
Теперь при создании экземпляра класса можно использовать любой из двух конструкторов.
Dim myBlackBox As BlackBox = New BlackBox(«Мой персональный черный ящик»)
Dim myBlackBox As BlackBox = New BlackBox(«Мой персональный черный ящик», «Прошлогодние газеты»)
Это справедливо для любого метода (Function или Sub), при этом возвращаемое значение тоже может быть разным.
Public Function OpenBox(ByVal DropContent As Boolean) As Boolean
Dim isSomethingThere As Boolean
Public Function OpenBox() As Boolean
Dim isSomethingThere As Boolean
Public Function OpenBox(ByVal WhatToAdd As String) As String
Но, учтите, что функции должны отличаться параметрами, только тогда переопределение происходит, иначе компилятор выдаст ошибку, если вы определите для одинаковые функции отличающиеся лишь типом возвращаемого значения. На практике этого и не нужно, так как значение можно преобразовать. Также, я должен сказать, что существует способ визуально выделить перегруженные (перегружаемые) методы, добавив к определению каждого ключевое слово Overloads.
Public Overloads Function OpenBox(ByVal DropContent As Boolean) As Boolean
Dim isSomethingThere As Boolean
Public Overloads Function OpenBox() As Boolean
Dim isSomethingThere As Boolean
Public Overloads Function OpenBox(ByVal WhatToAdd As String) As String
Если вы используете ключевое слово Overloads хотя бы в одном определении функции, то вы должны использовать его во всех остальных. Зато, просматривая код в будущем, вы сразу же найдете перегруженные (переопределенные) методы.
Наследование
Так, хорошо, теперь у нас есть готовый класс. Что же еще интересного нам позволяет сделать концепция ООП? Например, мы можем создать новый класс основываясь на этом, как бы унаследовав все его свойства и методы. Таким образом, чтобы написать новый класс нам не придется заново писать код всех методов и свойств, достаточно только внести некоторые изменения в существующий. Но, прежде чем наследовать новые классы, нужно сделать несколько изменений в существующем классе и определить, какие методы могут быть изменены (переопределены, опять!) в производном классе (derived). Пожалуй, хватит мучить наш «Черный ящик», пусть он немного отдохнет, а мы создадим новые классы, один назовем родителем (Parent), а другим дочерним (Child). Для наследования используется ключевое слово Inherits, а для того, чтобы пометить методы как переопределяемые, используется ключевое слово Overridable.
Public Class Parent
Public Function Method() As String
Return «Parent -> Method»
Public Overridable Function OverridableMethod() As String
Return «Parent -> OverridableMethod»
Public Class Child
Public Overrides Function OverridableMethod() As String
Return «Child -> OverridableMethod»
Кстати, в Visual Studio, послетого как вы создадите наследованный класс, вам не придется заново набирать определение переопределяемых методов в производном классе — достаточно выбрать метод из выпадающего списка Overrides методов (в окне редактирования кода). Посмотрим как работают созданные нами классы, заодно убедившись в правоте всех вышесказанных слов.
Dim myParent As Parent = New Parent()
Dim myChild As Parent = New Child()
MessageBox.Show(myParent.Method()) ‘ отобразит Parent — > Method
MessageBox.Show(myChild.Method()) ‘ отобразит Parent — > Method
MessageBox.Show(myParent.OverridableMethod()) ‘ отобразит Parent — > OverridableMethod
MessageBox.Show(myChild.OverridableMethod()) ‘ отобразит Child — > OverridableMethod
47Графический интерфейс. Системы объектно-ориентированного программирования позволяет визуализировать процесс создания графического интерфейса разрабатываемого проекта, т.е. позволяют создавать объекты и устанавливать значения свойств с помощью диалоговых окон системы программирования.
Графический интерфейс необходим для реализации интерактивного диалога пользователя с запущенным проектом. Основой для создания графического интерфейса разрабатываемого проекта является форма, которая представляет собой окно, на котором размещаются элементы управления. Необходимо отметить, что графический интерфейс проекта может включать в себя несколько форм.
Форма – это объект, представляющий собой окно на экране, в котором размещаются элементы управления.
Визуальное конструирование графического интерфейса проекта состоит в том, что на форму с помощью мыши помещаются и «рисуются» те или иные элементы управления.
Классы элементов управления имеют различное назначение в графическом интерфейсе проекта. Текстовые поля, надписи и списки обычно используются для ввода и вывода данных, графические окна – для вывода графики, командные кнопки, переключатели и флажки для организации диалога и т.д.
На форму может быть помещено несколько экземпляров одного класса элементов управления. Например, несколько кнопок, каждая из которых обладает индивидуальными значениями свойств (надпись, размеры и др.).
Элементы управления – это объекты, являющиеся элементами графического интерфейса проекта, и реагирующие на события, производимые пользователем или другими программными объектами.
Форма и элементы управления обладают определенными наборами свойств, методов и событий.
Событийные процедуры. Для каждого события можно запрограммировать отклик, т.е. реакцию объекта на произошедшее событие. Если пользователь производит какое-либо воздействие на элемент графического интерфейса (например, щелчок), в качестве отклика выполняется некоторая последовательность действий (событийная процедура).
Каждая событийная процедура представляет собой отдельный программный модуль, который реализует определенный алгоритм. Создание программного кода событийной процедуры производится с использованием алгоритмических структур различных типов (линейная, ветвление,выбор и цикл).
Имя процедуры включает в себя имя объекта и имя события.
Событийная процедура представляет собой подпрограмму, которая начинает выполняться после реализации определенного события.
48 Алфавит языка Visual Basic
Алфавит — это полный набор букв, цифр и символов, принятых в языке для обозначения данных и действий над ними.
Алфавит языка Visual Basic включает следующий набор символов:
— прописные (A — Z) и строчные (а — z) буквы латинского алфавита;
— цифры от 0 до 9;
— знаки арифметических операций (в порядке возрастания приоритета): +, -, *, /, |, ^;
— знаки операций отношения: =, <, >.
— знаки препинания и разделители: , . : ; ( );
В алфавит языка входят также зарезервированные слова, которые не могут быть использованы в качестве имен переменных или процедур. Примеры зарезервированных слов: Dim, Sub, Integer и т.д. По умолчанию для выделения ключевых слов в окне редактирования кода Visual Basic используют шрифт синего цвета.
Данные — это возможные структуры языка, над которыми выполняются разрешенные действия (операции): константы, переменные и массивы. По способности к изменению все данные делятся на переменные и константы.
Переменная — это величина, которая может меняться при выполнении программы.
Константа — величина, не меняющаяся в процессе работы. Примером константы может быть число .
Статья №2
Переменная – это величина, которая может меняться в процессе выполнения программы. В Bascom переменная, а следовательно и в микроконтроллере, — это быстрое осуществление доступа к ячейке памяти, данные в которой могут меняться.
В Bascom переменные бывают следующих типов:
В этой статье мы ограничимся пока знакомством с числовыми переменными, а далее, по мере усложнения программ, с остальными.
В Bascom есть следующие типы числовых переменных:
Хранит значение 0 или 1. Используется для хранения состояния кнопки, переключателя, контакта порта ввода/ вывода и др.
Xранит в памяти один байт (8 бит). Используется для хранения числа от 0 до 255 или символа. Часто используется в микроконтроллерах AVR типа tiny, когда память ограничена. Необходимо отметить, что при прибавлении 1 к переменной Byte, имеющей значение 255, она сбрасывается до 0.
Хранит в памяти два байта. Используется для хранения числа от -32768 до +32767. Так как один бит зарезервирован под знак числа, оставшиеся делятся 15 делятся пополам на положительные и отрицательные значения. При переполнении переменной данного типа, её значение изменится с +32767 на -32768.
Хранит два байта информации, не имеющей знака. Для хранения доступны все 16 бит, т.е. числа от 0 до 65535. При переполнении значение 65535 изменяется до 0.
Хранит в памяти 4 байта. Из 32 бит один отводится под знак, а остальные хранят модуль числа от -2147483648 до 2147483647. При переполнении значение переменной +2147483647 изменится на -2147483648.
Четырёхбайтный тип для хранения чисел с плавающей запятой. Запоминает числа от 1.5х10ˆ45 до 3.4×10ˆ38. Используется только для хранения дробных чисел не более девяти знаков после запятой.
Пример описания переменной:
Dim X as Byte ‘ Объявим переменную Х типа Byte
X = 100 ‘ положим в неё число 100
Теперь возвратимся к программе “INT0”, которая была представлена в статье №1. Дело в том, что только идеальная кнопка может строго переключать состояние с разомкнутого на замкнутый и обратно, но таких кнопок в природе, к сожалению, нет. При нажатии и отпускании реальная кнопка выдаёт серию импульсов, называемых дребезгом, длительность которого может достигать 50 миллисекунд. Таким образом мы получим множество прерываний вместо одного. Поэтому необходимо реализовать функцию антидребезга с помощью введения в программу задержки. Назовём новую программу “INT0 + DEB”. Её блок – схема представлена на Рис.1.
Здесь видно, что в программу введены две задержки: задержка по срабатыванию от внешнего сигнала и задержка после появления слова на дисплее. Таким образом, программа как бы пережидает дребезг и при нажатии кнопки и при её отпускании. Ниже приведена программа “INT0 + DEB”.
Первая задержка создана с помощью функции задержки срабатывания от внешних сигналов DEBOUNCE, а вторая – с помощью Waitms. Они равны, и их длительность составляет по 75 миллисекунд. В остальном же программа идентична программе “INT0”.
config Portd.6 = output 'PD6-выход
config portd.6 = 0 'исходное состояние PD6=0
config PORTD.2 = input 'PD2-вход
config portd.2 = 1 'исходное состояние PD2=1 (подтяжка)
config INT0 = FALLING 'прерывание INT0 по спаду импульса
config DEBOUNCE = 75 'задержка внешних сигналов на 75мс
dim Wtime as Byte 'объявление переменной типа Byte
on Int0 Displey 'определение подпрограммы прерывания
cls 'очистка дисплея
Wtime = 255 'величина задержки
Enable INTERRUPTS 'включение всех прерываний
Enable INT0 'вкючение прерывания INT0
do 'начало цикла
set Portd.6 'установка PD6=1
waitms Wtime 'задержка=255 тактов
reset PortD.6 'установка PD6=0
loop 'конец цикла
Displey: 'подпрограмма обработки прерывания
Lcd «stop» 'вывод на дисплей слова Stop
Waitms 75 'задержка 75мс
return 'оператор возврата из подпрограммы
end 'end program
Cама программа находится в папке приложение 1 данной статьи.
Теперь пришло время поговорить о таймерах. Как известно микроконтроллер ATtiny2313 имеет четыре таймера: два восьмибитных таймера – счётчика (0А и 0В) и два шестнадцатибитных таймера – счётчика (1А и 1В), однако скачанная автором из интернета версия Bascom не поддерживает данные таймеры, поэтому мы будем говорить о Timer0 и Timer1 (версия для AT90S2313). Однако все сказанное ниже в полной мере справедливо и для ATtiny2313.
Восьмибитный таймер – счётчик (Timer0) может принимать значение от 0 до 255. С помощью команды Config мы можем задать ему коэффициент деления частоты:
Config Timer0 = Timer, Prescale = 1|8|64|256|1024
Здесь Timer0 настроен на счёт. Он считает тактовые импульсы с выхода делителя с переменным коэффициентом деления 1, 8, 64, 256, 1024. Если тактовая частота контроллера 4МГц, а коэффициент деления 1024, тогда таймер будет увеличивать значение через каждые 0.256 миллисекунд (1024/4000000 Гц) и будет переполняться каждые 65 миллисекунд (255 х 0.256). Timer1 подобен Timer0, но считает, поскольку он шеснадцатибитный, до 65535. Таймеры начинают осчёт сразу после конфигурации.
Таймеры можно запустить и остановить в любой момент командами Start и Stop. Например: Start Timer0 и Stop Timer0 или Start Timer1 и Stop Timer1.
Лекция: Постоянные и переменные величины
Любой алгоритм представляет собой не что иное, как последовательность действий над величинами. Различают постоянные и переменные величины.
Постоянные величины – это такие величины, значения которых не меняются в процессе выполнения программы.
Постоянные величины служат в качестве исходных данных и констант при выполнении программы.
Примеры постоянных величин:
ü целые числа 1 156 -12 3456
ü вещественные числа 2.5 -154.12 56.0
ü строки символов ‘Привет’ ‘Введи число’ ‘А=’
Переменные величины– это такие величины, значения которых могут меняться в процессе выполнения программы.
Переменные величины — главный объект действий в программе. Они используются для обозначения промежуточных и окончательных результатов. Каждой переменной надо дать собственное имя, отличающее её от других переменных.
Имя переменнойсоставляется из латинских букв и цифр, но первой должна стоять обязательно буква и посреди имени не должно быть пробелов.
Линейные программы
Линейной называется программа, все операторы которой выполняются последовательно, в том порядке, в котором они записаны. Это самый простой вид программ.
Переменные
Переменная – это величина, которая во время работы программы может изменять свое значение. Все переменные, используемые в программе, должны быть описаны в разделе описания переменных, начинающемся со служебного слова var.
Для каждой переменной задается ее имя и тип, например:
var number : integer; х, у: real;
Имя переменной определяет место в памяти, по которому находится значение переменной. Имя дает программист. Оно должно отражать смысл хранимой величины и быть легко распознаваемым.
Тип переменных выбирается исходя из диапазона и требуемой точности представления данных.
При объявлении можно присвоить переменной некоторое начальное значение, т.е. инициализировать ее. Под инициализацией понимается задание значения, выполняемое до начала работы программы. Инициализированные переменные описываются после ключевого слова const:
number : integer = 100; x: real = 0.02;
option : char = ‘ю’;
По умолчанию все переменные, описанные в главной программе, обнуляются.
Выражения
Выражение – это правило вычисления значения. В выражении участвуют операнды, объединенные знаками операций. Операндами выражения могут быть константы, переменные и вызовы функций. Операции выполняются в определенном порядке в соответствии с приоритетами, как и в математике. Для изменения порядка выполнения операций используются круглые скобки, уровень их вложенности практически не ограничен.
Результатом выражения всегда является значение определенного типа, который определяется типами операндов. Величины, участвующие в выражении, должны быть совместимых типов.