|
Программирование >> Программирование с использованием ajax
4 Fonni Forml Рис. 8.14. Форма приложения ChOSExOl после щелчка на кнопке buttonl Рис. 8.15. Форма приложения ChOSExOl после щелчка на кнопке New Button! Начиная с формы, которая всем заправляет, и заканчивая элементами управления, которые присутствуют на этой форме, все время требуется применять приемы ООП. В данном упражнении были задействованы несколько из понятий, которые рассматривались ранее в этой главе, для того, чтобы показать, как все они сочетаются вместе. Первым делом на форму Forml приложения была добавлена новая кнопка, представляющая собой объект Button. Далее путем выполнения двойного щелчка на кнопке был добавлен обработчик событий для перехвата генерируемого объектом Button события Click. Этот обработчик был добавлен в код объекта Form, который инкапсулирует приложение, в виде приватного метода: private void buttonl Click(object sender. System.EventArgs e) В этом коде ключевое слово private выступает в роли спецификатора. Пока что об этом не стоит особо беспокоиться, потому что в следующей главе код С#, требуемый для применения приемов ООП, описанных в настоящей главе, будет объясняться более подробно. В первой добавленной строке коде изменяется текст на кнопке, на которой выполняется щелчок, что подразумевает применение полиморфизма, о котором рассказывалось ранее в главе. Объект Button, представляющий эту кнопку, отправляется обработчику событий в виде параметра object, который приводится к типу Button (что возможно, поскольку объект Button унаследован от System.Object, т.е. класса .NET, для которого object является псевдонимом). Затем вносится изменение в свойство Text объекта для изменения отображаемого текста: ((Button)sender).Text = Clicked! ; Далее создается новый объект Button с использованием ключевого слова new (обратите внимание, что пространства имен специально создаются в этом проекте так, чтобы они позволяли применять подобный простой синтаксис; в противном случае для создания этого объекта нужно было бы использовать полностью квалифицированное имя - System.Windows.Forms.Button): Button newButton = new Button (); newButton.Text = New Button! ; В другом месте в коде после этого добавляется соответствующий новый обработчик событий, который используется для реагирования на событие Click, генерируемое новой кнопкой: private void newButton Click(object sender. System.EventArgs e) { ((Button)sender).Text = Clicked!! ; Затем этот обработчик регистрируется в качестве слушателя события Click с использованием синтаксиса перегрузки операций. С помощью конструктора создается новый объект EventHandler с именем новой функции-обработчика событий: newButton.Click += new EventHandler(newButton Click); Напоследок используется свойство Controls. Это свойство является объектом, представляющим коллекцию всех имеющихся на форме элементов управления, метод Add () которого применяется для добавления в форму новой кнопки: Controls.Add(newButton) ; Свойство Controls иллюстрирует то, что свойства не обязательно должны относиться к простым типам вроде строк или целых чисел, и что они могут представлять собой объекты любого рода. В этом коротком примере были использованы почти все из описанных в настоящей главе приемов. Это позволяет сделать вывод о том, что приемы объектно-ориентированного программирования вовсе не всегда являются сложными - чтобы понять это, достаточно просто взглянуть на них под другим углом. Резюме В этой главе было приведено полное описание приемов объектно-ориентированного программирования. За основу был взят контекст программирования на С#, но отразилось это по большей части только на иллюстрировавшихся примерах. То есть большая часть изложенного в настоящей главе материала подходит для применения приемов ООП на любом языке. Сначала были рассмотрены основные вопросы вроде того, что подразумевается под термином объект , и как объект может являться экземпляром класса. Далее рассказывалось о том, что объекты могут иметь разные члены, вроде полей, свойств и методов, что эти члены могут иметь ограниченную доступность, и чем общедоступные члены отличаются от приватных. Сразу же после этого было показано, что члены еще могут быть защищенными, а также виртуальными и абстрактными (и что абстрактные методы допускается иметь только абстрактным классам). Было показано и то, чем статические (совместно используемые) члены отличаются от членов экземпляра и почему в некоторых случаях может быть выгоднее использовать именно статические классы. Затем был вкратце рассмотрен жизненный цикл объекта вместе с конструкторами, которые могут применяться на этапе его создания, и деструкторами, которые вступают в действие на этапе его удаления. Чуть позже, после изучения возможности группирования членов в интерфейсах, была описана и более сложная методика уничтожения объектов с участием освобождаемых объектов, поддерживающих интерфейс IDisposable. Остальная часть главы была в основном посвящена перечислению средств и приемов ООП, многие из которых будут более подробно рассматриваться в последующих главах. В частности, здесь рассказывалось о наследовании, позволяющем наследовать классы от базовых классов, о двух разновидностях полиморфизма, позволяющих применять базовые классы и совместно используемые интерфейсы, и об отношениях, позволяющих помещать в объект один или более других объектов (за счет применения отношений включения и коллекций). Напоследок было показано, как применение методики перегрузки операций может упрощать синтаксис использования объектов и то, как объекты генерируют события. В заключительной части главы большая часть рассмотренных теоретических сведений была продемонстрирована на примере создания простого Windows-приложения. В следующей главе речь пойдет об определении классов в С#. Упражнения 1. Какие из перечисленных ниже уровней доступности действительно существуют в ООП? friend public secure private protected loose wildcard 2. Деструктор объекта нужно обязательно вызывать вручную, иначе память будет использоваться неэффективно . Верно это или нет? 3. Нужно ли создавать объект для вызова статического метода его класса? 4. Нарисуйте UML-диаграмму, подобную приведенным ранее в главе, для перечисленных ниже классов и интерфейса. Абстрактный класс с именем HotDrink (Горячий напиток), имеющий такие методы, как Drink (Пить), AddMilk (Добавлять молоко) и AddSugar (Добавлять сахар), и свойства вроде Milk (Молоко) и Sugar (Сахар). Интерфейс по имени ICup (Чашка), имеющий такие методы, как Refill (Наполнять снова) и Wash (Мыть), и свойства вроде Color (Цвет) и Volume (Объем). Класс по имени CupOfCoffee (Чашка кофе), унаследованный от класса HotDrink (Горячий напиток), поддерживающий интерфейс ICup и обладающий таким дополнительным свойством, как ВеапТуре (Сорт кофейных зерен). Класс по имени CupOfTea (Чашка чая), унаследованный от класса HotDrink, поддерживающий интерфейс ICup и обладающий таким дополнительным свойством, как Leaf Туре (Сорт чайных листьев). 5. Напишите код для функции, которая будет в качестве параметра принимать один из двух возможных в предыдущем примере объектов типа Сир (CupOfCoffee или CupOfTea). Эта функция должна вызывать методы AddMilk, Drink и Wash для любого передаваемого ей объекта Сир.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.003
При копировании материалов приветствуются ссылки. |