Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Еще об объектах

Элемент управления CommonDialog | Панель инструментов Toolbar | Работа с несколькими формами | Структура проекта. Окно Project Explorer. | Зоны видимости | Public Sub П2() | Префиксы имен | Глава 20. Объекты пользователя | Таймер и общая механика работы проекта | Создаем ловца |


Читайте также:
  1. БД – это совокупность сведений о конкретных объектах реального мира в какой-либо предметной области. Синоним термина «база данных» – «банк данных».
  2. ГРАЖДАНСКАЯ ОБОРОНА НА ОБЪЕКТАХ НАРОДНОГО ХОЗЯЙСТВА
  3. На транспортных, дорожно-транспортных объектах
  4. Организация управления гражданской обороной на объектах здравоохранения.
  5. Пожаро-, взрывоопасные объекты. Возможные последствия аварий на пожаро-, взрывоопасных объектах. Правила поведения при пожаре и угрозе взрыва.
  6. Решение (приказ, распоряжение) N ___ <1> о проведении аварийно-спасательных работ на объектах и территориях организаций, находящихся в зоне чрезвычайной ситуации

У вас могло создаться превратное впечатление, что объект - это обязательно что-то движущееся, причем в темпе, задаваемом таймером. Совсем нет. Вспомните элементы управления - список, флажок. Это все тоже объекты. Вы можете создать класс пользователя, представляющий собой набор процедур и функций для сложной обработки информации в текстовом поле. И таймера здесь никакого не нужно.

Вы знаете, что у элементов управления есть свойства, методы и события. У объекта пользователя мы изучили только свойства и методы. А события? Они тоже есть, вернее, вы можете запрограммировать их. Но останавливаться на этом я не буду.

Форма как объект

Ревниво оберегая и инкапсулируя объекты пользователя, мы совсем забыли о форме. Ведь это тоже объект. И не годится оставлять его незащищенным извне, то есть со стороны модулей классов и кода. Надо инкапсулировать. Все, что можно, делать Private.

Кстати, мы ведь можем во время работы проекта "штамповать" нашу форму, как "штамповали" объекты по их классу. Делается это так. Добавьте в форму нашей игры кнопку Command1 и запишите в окно кода формы такую процедуру:

Private Sub Command1_Click()

Dim f1 As New f 'Объявляется новая форма f1 как копия формы f

f1.Show 'Форма f1 загружается и показывается на экране

End Sub

Запустите проект и в один из моментов игры нажмите кнопку Command1. Вы увидите, что игра идет уже на двух столах, причем одна и та же игра. Подвигайте ловца, понажимайте на кнопки. Поразмыслите сами, какие это сулит возможности в будущем.

Свойства только для чтения

Свойства только для чтения, как я уже говорил чуть раньше, нужны для того, чтобы обезопасить наш объект от вмешательства извне. Давайте сделаем свойством только для чтения свойство x ловца. Идея здесь такая. Объявим x, как Private. Проект сразу перестает работать, так как модулю формы для смещения изображения ловца нужно знать его координаты. Придумаем нашему свойству x "псевдоним", под которым он будет виден снаружи - Xл. Вся "фишка" в том, чтобы написать в классе clsЛовец глобальную функцию с именем Xл, все тело которой состоит из единственного оператора Xл=x:

Public Function Xл() As Long

Xл = x

End Function

Теперь заменим везде снаружи обращение Ловец.x на Ловец.Xл. Поскольку обращение к переменной и функции без параметров синтаксически неотличимо, то снаружи могут сколько угодно думать, что обращаются к переменной Xл, когда на самом деле это функция. Проект работает, проверьте. А где же здесь желанная цель "только для чтения"? А она достигнута. Потому что присваивать значение функции мы можем только в ее теле, а уж никак не из других модулей.

Теперь сотрите эту функцию. Создадим ее другим, общепринятым путем. Visual Basic предлагает удобный интерфейс для создания процедур, функций, событий и свойств: Tools®Add Procedure® поставьте переключатели в положение Property (так как мы хотим создать свойство) и Public, дайте имя свойству - Xл ®OK. Перед нами появятся две заготовки:

Public Property Get Xл() As Variant

 

End Property

 

Public Property Let Xл(ByVal vNewValue As Variant)

 

End Property

Слова Property Get означают "Получи (узнай) значение свойства", а слова Property Let означают "Присвой значение свойству". Нижнюю заготовку стираем, так как она предлагает записать код, позволяющий менять значение Xл снаружи. А верхнюю можно использовать вместо старой функции, заменив для порядка Variant на Long:

Public Property Get Xл() As Long

Xл = x

End Property

Здесь открывается простор для контроля со стороны объекта над желающими снаружи видеть свойство и даже для введения их в заблуждение, так как в теле свойства мы можем писать какой угодно код, например:

Public Property Get Xл() As Long

Xл = x + 1000

If x > 5000 Then MsgBox ("Дальше замучаю сообщениями")

End Property

Наследование, полиморфизм

Кроме инкапсуляции у классов объектов есть еще две замечательные черты: наследование и полиморфизм. Они важны в тех проектах, где имеются не один-два класса объектов, а целые их системы, иерархии. Понятие о наследовании и полиморфизме я дам вам на уровне аналогий.

Вообразим, что мы создали простой класс Автомобиль, наделив его всего лишь двигателем, рулем и 4 колесами. И никаких подробностей. Полюбовавшись работой получившейся самоходной тележки, мы решили развивать проект дальше и создать еще три класса, более богатых и подробных: Амфибия, Грузовик и Автобус. У каждого из новых классов, как и у Автомобиля, есть двигатель, руль и 4 колеса, но вдобавок к ним и много подробностей, например, у Амфибии гребной винт, а у Грузовика - кузов.

Как создавать эти 3 класса? Можно так же, как мы создавали clsШар, когда мы вручную записали весь код, причем скопировав часть кода из clsЛовец. В нашем случае нам можно было бы скопировать весь код Автомобиля в каждый из трех модулей, добавив затем в них для каждого свои процедуры и функции. Но есть гораздо более удобный и "правильный" способ - это наследование. Мы просто объявляем, что новый класс Грузовик является наследником класса Автомобиль. При этом Грузовик неявно (невидимо) приобретает весь код своего родителя - Автомобиля. Ничего не записав в код Грузовика, мы уже можем пользоваться им как Автомобилем. Чтобы снабдить Грузовик дополнительными чертами, мы пишем ему новые процедуры и функции. Аналогично поступаем с Амфибией и Автобусом.

Самое интересное то, что если мы изменяем что-то в коде родителя (Автомобиль), то это изменение тут же сказывается на наследниках. Например, если мы в Автомобиле заменили двигатель внутреннего сгорания на электрический, то эта замена немедленно произойдет и в Амфибии, и в Грузовике, и в Автобусе. Это очень ценное и удобное качество.

Полиморфизм в частном случае - это выполнение разных действий процедурами с одинаковыми именами. Так, метод Начальная_установка шар и ловец выполняют по-разному. При наследовании полиморфизм проявляется тогда, когда мы у наследника как-то изменяем процедуру родителя. Скажем, если для Автомобиля процедура Остановка это просто остановка, то для Автобуса это еще и объявление по громкоговорителю названия остановки.

В заключение должен сказать, что Visual Basic версий 6.0 и более ранних не поддерживает настоящие полиморфизм и наследование. Впервые их поддержка осуществлена в Visual Basic.NET.

 


Дата добавления: 2015-11-16; просмотров: 46 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Создаем шар. Завершаем проект| Понятие об Интернет, Web-станицах и языке HTML

mybiblioteka.su - 2015-2024 год. (0.008 сек.)