| Использование ООП в VB.Net |
|
Когда мы говорим о преимуществах и особенностях реализации объектно-ориентированного подхода (ООП) перед альтернативными методами программирования, в это же самое время мы говорим о достоинствах и способах использования классов. В этой статье я хотел бы поговорить о том, для чего нужны классы, и как их использовать. Когда мы говорим о преимуществах и особенностях реализации объектно-ориентированного подхода (ООП) перед альтернативными методами программирования, в это же самое время мы говорим о достоинствах и способах использования классов. В этой статье я хотел бы поговорить о том, для чего нужны классы, и как их использовать. Одна из причин, по которой мы должны использовать классы является так назы-ваемое "повторное использование кода". Напомним, что в любом классе имеется хотя бы одна функция. Такие функции называются также "методами" или "членами" класса. Ис-пользуя в свой работе тот или иной класс, мы делаем это потому, что нам нужны те или иные функции-члены этого класса. Предположим, имеется некий класс, назовем его MyFirstClass, в котором содержатся две функции, рассчитывающие площади фигур RectangleArea и Cir-cleArea. Посмотрим, как эти функции можно вызывать из Windows- или Web-приложений. Windows-приложениеСоздаем новый проект, добавляем к нему модуль класса со следующим кодом: Public Class MyFirstClass Далее, переносим на форму кнопку, дважды щелкаем по ней мышкой и в поя-вившемся коде обработчика событий вводим следующий текст: Dim obj As New MyFirstClass Web-приложениеОтличие Web-проекта от Windows-приложения заключается в том, что класс мы должны предварительно откомпилировать, создав из него dll-файл. Итак, нам необходимо открыть блокнот, набрать в нем следующий код: Imports System Далее, набранный текст нужно сохранить с именем FigureArea.vb. В папку, где находится этот файл скопировать файл vbc.exe, обычно он находится по адресу C:\WINNT\Microsoft.NET\Framework\v1.1.4322. После этого в ко-мандной строке нужно набрать следующий код: vbc /t:library /r:System.dll FigureArea.vb В результате чего мы получим файл FigureArea.dll.
Теперь мы создаем Web-проект, в папку \bin копируем файл FigureArea.dll, создаем файл FigureArea.aspx, код которого будет сле-дующий: <html> Из листинга видно, что мы в начале создаем объектную переменную, связан-ную с классом MyFirstClass, а затем вызываем функции-члены класса, подставляя в них фактические параметры (obj.RectangleArea(a, b) и obj.CircleArea(r)).
Посмотрим, что у нас получилось. И в первом и во втором случаях, мы вызыва-ем функции-члены класса, используя объектную переменную. Очевидно, что если наш Web-проект состоит только из одной ASP.Net-странички, а Windows-приложение - только из одной формы, многократного использования кода не получится, проще пользоваться отдельными функциями. Однако когда речь идет о сайте, состоящем из сотен Web-страничек, использующих одни и те же функции, в этом случае выигрыш будет очевиден (так как функции-члены класса доступны для всего проекта). Вторым плюсом использования откомпилированных в .dll-файл клас-сов является защита интеллектуальной собственности, так как внутреннее содержимое класса скрыто в .dll-файле.
Ключевое слово NewКлючевое слово New указывает VB.Net создать новый экземпляр класса MyFirstClass. Объявление переменной без этого ключевого слова, говорит компилято-ру, что мы планируем хранить в переменной экземпляр класса, но пока этот экземпляр создавать не нужно. Когда мы захотим инициализировать переменную, достаточно будет задать отдельную строку с ключевым словом New: Dim obj As New MyFirstClass()
При попытке обратиться к переменной, объявленной без ключевого слова New и не инициализированной с помощью приведенной выше инструкции, будет сгенерирова-но исключение "Null Reference". Это исключение означает, что переменная имеет значение Null, то есть она еще не инициализирована.
Задание: Разработайте программу, находящую площадь трапеции. Разработайте программу, находящую объем тора. Ранее было сказано о том, что в любом классе есть хотя бы одна функция. Как известно, обычно у функций бывают аргументы. В предыдущем примере было показано, как можно подставлять фактические значения аргументов функций. В первом случае пе-ременные a, b и r имели глобальную область видимости (Public a As Double) и мы их инициализировали в вызывающем приложении (obj.a = 3). Во втором случае фактические параметры мы подставляли при вызове функций (RectangleArea = obj.RectangleArea(a,b)). У показанных здесь способов использования аргументов функций-членов клас-са есть определенные недостатки. Дело заключается в том, что зачастую бывает жела-тельно перед подстановкой аргумента убедиться в том, что он удовлетворяет определен-ным условиям (например, возраст человека не может быть отрицательным числом). В таких случаях между вызывающим приложением и функциями-членами класса вводят особых посредников - так называемые свойства класса (Properties). Свойства обычно являются общедоступными переменными класса, то есть они видны в вызывающем приложении, наряду с ними в классах обычно еще используются переменные с локальной областью видимостью (private), доступные только в дан-ном классе, они являются аргументами функций-членов класса. Свойства состоят из двух разделов: Set и Get. Работа со свойствами производится следующим обра-зом. В вызывающем приложении свойству присваивается некоторая величина, далее, в разделе Set свойства производится проверка области допустимых значений. Если проверка прошла хорошо, то это значение присваивается некой локальной переменной класса в разделе Get, которая, как мы знаем, является аргументом некой функции класса. В противном случае, или выдается сообщение об ошибке, или срабатывает так на-зываемый обработчик исключений (об этом ниже). То есть, свойства класса являются не-кими шлюзами между вызывающим приложением и функциями-членами класса.
В следующем примере программа выдает на экран одно из семи изречений. Пользователь должен ввести любую цифру от 1 до 7. Вернемся к нашему Windows-приложению. Добавим еще один класс (OracleClass) со следующим содержимым: Public Class OracleClassЗатем, в форме размещаем поле вода со свойством Name txtNumber и кнопку, в обработчике событий которой вводим следующее: Dim n As Integer Общедоступная функция Maxim возвращает поговорку в строковом формате в зависимости от введенного пользователем номера. Если этот номер больше семи, то в раз-деле Set номер приравнивается нулю, выдается сообщение об ошибке, а функция возвращает первую фразу.
Задание: Разработайте программу, выводящую на экран имена семи гномов из сказки "Белоснежка". Разработайте программу, выводящую на экран 10 заповедей. Разработайте программу, выводящую на экран 7 смертных грехов
В следующем примере мы рассмотрим использование обработчиков исключе-ний. Предлагаемая программа генерирует неповторяющуюся последовательность целых чисел в заданном диапазоне.
Вновь вернемся к нашему Windows-приложению. Создаем класс RandomClass со следующим кодом: Public Class RandomClass Из листинга видно, что класс содержит три свойства LowerLevel, Upper-Level и TestingNumber (нижний предел, верхний предел и количество испытаний), а также функцию RandomArray, генерирующую массив случайных чисел. В разделах Set данных свойств проводится проверка того, чтобы введенные значения были положительными, если требование удовлетворяется, то значения, введенные пользовате-лем в вызывающей программе (см. ниже) присваиваются локальным переменным класса a, b и n в соответствующих разделах Get, в противном случае срабатывают обра-ботчики исключений LowerLevelException, UpperLevelException и Testing-NumberException, которые обрабатываются в вызывающем приложении. Далее разместим в форме три поля ввода txtA, txtB и txtN, и кнопку, со следующим кодом:
'Инициализируем экземпляр класса MyRandomList Из листинга видно, как работают обработчики исключений: в случае отрица-тельных значений, веденных пользователем, величины заменяются модулем этих чисел.
Задание: Разработайте программу, решающую квадратное уравнение, причем таким образом, чтобы коэффициент a не превышал 30, коэффициент b - 40, а c - 50. Инкапсуляция и абстракцияИнкапсуляция классов означает, что для тех, кто использует данный класс, последний представляется в виде "черного ящика". Из житейского опыта мы знаем, что для того, чтобы, скажем, переключить канал в телевизоре, нет необходимости самому настраивать переключатель телевизионных каналов, достаточно воздействовать на соот-ветствующий орган управления, расположенный на пульте дистанционного управления (являющегося "элементом интерфейса" телевизора). То же самое можно и сказать о при-бавлении "газа" в автомобиле. В классах интерфейс образуют свойства и методы послед-них. Абстракция означает, что классы позволяют скрыть некую сложную внутреннюю структуру объекта, позволяя программисту сосредоточиться на программи-ровании более высокого уровня. Особенно удобен подобный подход при командной раз-работке клиент-серверных приложений. При этом один участник проекта может разрабо-тать базу данных и функции-методы доступа к данным, заключенные в соответствующем классе, например, DataBaseClass(), избавляя разработчика клиентского приложения от необходимости глубоко вникать во внутреннюю структуру БД. При этом, последний просто создает объектную переменную (Dim obj As New DataBaseClass()), свя-занную с соответствующим классом и вызывает функции типа obj.SaveProduct() или obj.AddCustomer().
Предположим, что нам требуется создать приложение, которое вводило бы све-дения о преподавателях некоего университета в базу данных отдела кадров. При этом про-грамма должна следить за тем, чтобы идентификационные номера преподавателей были уникальными. Предполагается, что проект большой, и один из программистов разрабаты-вает серверную часть проекта, записывающую в базу данных сведения о преподавателях, а другой - создает клиентское приложение, при этом он может ничего не знать о структуре базы данных.
Серверная часть В начале требуется создать каталог teacher на диске C. В нем будут находиться файлы базы данных. Затем нужно запустить Анализатор запросов (Query Analyzer) СУБД Microsoft SQL Server 2000 и выполнить следующий код: USE master Как видно из листинга, база данных состоит из одной таблицы (TEACHER_TBL) и одной хранимой процедуры (ADD_UNIQUE_TEACHER_PROC), отвечающей за уникаль-ность идентификационного номера преподавателей. Затем, создаем Web-приложение, в блокноте набираем следующий код: Imports System
Сохраняем файл с именем AddTeacher.vb, компилируем его, как было показано выше, набирая в командной строке:
vbc /t:library /r:System.dll,System.Web.dll,System.Data.dll,System.XML.dll AddTeacher.vb
Полученный файл AddTeacher.dll также копируем в папку /bin нашего проекта. Теперь можно приступить к созданию клиентской части проекта.
Клиентская часть Клиентская часть представлена одной ASP.Net-страничкой AddLecturer.aspx со следующим кодом: <html> Из листинга видно, что для того, чтобы добавить сведения о преподавателе в базу данных совершенно необязательно знать структуру этой БД. Достаточно объявить объектную переменную (Dim obj as new AddTeacherClass()), заполнить необходимые поля класса и вызвать функцию AddTeacher(). Задание Создайте базу данных, состоящую из одной таблицы и одной храни-мой процедуры, подсчитывающей количество строк в таблице примерно следующего со-держания: Create Procedure GetAuthorCount As Return (Select Count(*) From Authors) GO Разработайте программу, выводящую на экран количество строк этой таб-лицы по аналогии с предыдущим примером.
Создайте базу данных, состоящую из одной таблицы. Разработайте про-грамму, предназначенную для занесений информации в эту таблицу. Класс должен со-держать процедуру NonQueryMethod (листинг приводится ниже). Перемен-ная strConnection - строка подключения, например, strConnection ="Integrated Security=SSPI; Initial Catalog=Northwind", другая переменная - QueryString - запрос на языке SQL, например, QueryS-tring="insert into Shippers(CompanyName, Phone) Values ('IBM','+7(3472)221109')". Sub NonQueryMethod(ByVal QueryString As String, ByVal strConnection _ Создайте базу данных, состоящую из одной таблицы. Разработайте про-грамму, предназначенную для удаления информации из этой таблицы, используя процеду-ру NonQueryMethod. Параметр QueryString в этом случае будет примерно таким: "Delete from Shippers where ShipperID=4".
Создайте базу данных, состоящую из одной таблицы. Разработайте про-грамму, предназначенную для изменения информации в этой таблице, используя процеду-ру NonQueryMethod. Параметр QueryString в этом случае будет примерно таким: "update Shippers set CompanyName='ООО "Рога и копыта"', Phone='+7(3472)02' where ShipperID=5". Наследование и полиморфизм
Классы расширяются путем создания новых классов, наследующих их функции. Это означает создание нового класса на основе существующего. Исходный класс называ-ется родительским или базовым. Производный класс наследует все функции базового класса, при этом обычно, в него добавляются новые функции или заменяются сущест-вующие. Помимо этого в производном классе могут быть перегружены методы исходного класса, т.е. добавлены новые формы этих методов, принимающие другие аргументы.
Рассмотрим программу, производящую дифференцирование и интегрирование функций. Возвращаемся к нашему Windows-приложению. Добавляем в него класс My-Function со следующим кодом: Public Class MyFunction Класс MyFunction будет родительским. Функции Derivative и Integral бу-дут наследоваться в производных классах. Ключевое свойство Overridable означает, что все классы, наследующие класс MyFunction, могут заменять стандартную реализацию соответствующего метода или свойства. На основе родительского класса MyFunction создадим три производных класса, предназначенные для нахождения производных и интегралов для таких функций, как y=x2, y=cos(x), y=sqrt(x) (Square_X, Cosine и SquareRoot_X). Public Class Square_X Вы, наверное, заметили, что в каждом производном классе присутствует ключевое слово Inherits MyFunction, означающее, что роди-тельским классом является класс MyFunction. Ключевое слово New используется при создании так называемого конструктора класса. Конструктор представляет собой подпро-грамму New, определенную внутри класса и вызываемую всякий раз, когда создается но-вый экземпляр класса. Именно в такую подпрограмму обычно включается инициализаци-онный код, выполняющий операции, подобные открытию файла или подключение к базе данных. В процедуре New существует подпрограмма MyBase.New, позволяющая полу-чить доступ к членам базового класса. Sub New(ByVal max_value As Double, ByVal min_value As Double) Конструктор класса позволяет при создании экземпляра класса сразу же его инициализировать, например, так: Dim myIntegral As New SquareRoot_X(5.6, 10.5) Если объект (экземпляр класса) уже не нужен, его можно установить в Nothing. При этом так называемый "уборщик мусора" (Garbage Collector) удалит его из оператив-ной памяти. myIntegral= Nothing 'Деструктор объекта Добавим к форме кнопку и три поля ввода txtDerivative, txtMin, txtMax (значения, подставляемые в формулу производной функции, а также верхний и нижний пределы интегрирования). В обработчике событий кнопки введем следующий код: Dim Derivative, Min, Max As Double Задание Разработайте программу, подсчитывающую объем и поверхность ци-линдра, конуса и пирамиды. Подытожив вышеизложенное, хотелось бы высказать свои соображения относительно того, в каких случаях нужно использовать классы.
Источник: http://www.ishodniki.kiev.ua/ |