|
Программирование >> Программирование с использованием ajax
указателей полностью скрывается от глаз разработчика в управляемом коде С#, тем самым делая код гораздо проще. К низкоуровневым операциям вроде манипулирования указателями в С# допускается получать доступ с помощью небезопасного кода, но эта тема является более сложной и здесь не рассматривается. Поверхностное копирование или глубокое копирование Копирование объектов из одной переменной в другую по значению, а не по ссылке (т.е. тем же образом, что и структур) может оказаться довольно сложной задачей. Поскольку один объект может содержать ссылки на множество других объектов, вроде полей и т.д., такое копирование может требовать выполнения массы операций по обработке. Простого копирования каждого члена из одного объекта в другой может быть недостаточно, поскольку некоторые из этих членов могут сами ссылаться на какие-то другие типы. В .NET Framework все это было учтено. Простого копирования объектов по членам можно добиться с помощью метода MemberwiseClone, унаследованного от класса System.Object. Этот метод является защищенным, но при желании можно объявить для объекта общедоступный метод, который вызывает данный. Подход, применяющий этот метод, называется поверхностным копированием, поскольку не берет в расчет члены ссылочного типа. Это означает, что члены ссылочного типа в новом объекте ссылаются на те же объекты, что и эквивалентные им члены в исходном объекте, что во многих случаях является далеко не идеальным. При желании, чтобы новые экземпляры интересующих членов создавались путем копирования и самих их значений (а не только ссылок), необходимо выполнять глубокое копирование. Существует один интерфейс, который можно реализовать и который позволяет делать это стандартным образом: называется он ICloneable. В случае применения этого интерфейса нужно также обязательно реализовать и тот единственный метод, который он содержит - Clone. Этот метод возвращает значение типа System.Object. Для получения такого объекта можно применять какую угодно обработку, путем реализации, однако, выбранного метода. Это означает, что при желании можно реализовать глубокое копирование (хотя обеспечение точного поведения не является обязательным, так что при необходимости можно выполнять и поверхностное копирование). Более подробно об этом пойдет речь в главе 11. Резюме В этой главе было показано, как определять классы и интерфейсы в С#, благодаря чему приведенная в предыдущей главе теория приобрела более конкретную форму. В частности, здесь было рассказано о синтаксисе, требуемом в С# для создания базовых определений, о ключевых словах, которые в них можно использовать для указания уровня доступности, о способе, которым можно осуществлять наследование от интерфейсов и других классов, о том, как определять абстрактные и герметизированные классы для управления таким наследованием, а также том, как определять конструкторы и деструкторы. Далее был вкратце рассмотрен класс System.Object, являющийся корневым базовым классом для любого определяемого класса. Этот класс предоставляет несколько методов, часть которых являются виртуальными (virtual), что позволяет переопределять их реализации. Еще этот класс позволяет воспринимать экземпляр любого объекта как экземпляр данного типа, тем самым предоставляя возможность применять полиморфизм с любым объектом. Затем были описаны некоторые средства, которые доступны в VS и VCE для разработки приложений с применением приемов ООП, а именно - окна Class View и Object Browser, и быстрый способ добавления новых классов в проект. Вдобавок было показано, как создавать сборки, не предназначенные для выполнения, но содержащие определения классов, пригодные для использования в других проектах. После этого было более подробно рассказано об абстрактных классах и интерфейсах, а именно - об их сходствах и отличиях и том, в каких ситуациях лучше применять те и другие. Напоследок снова была затронута темы ссылочных типов и типов-значений, но на этот раз немного больше с точки зрения структур (которые представляют собой эквивалентные объектам типы-значения). Это вылилось в обсуждение возможности выполнения поверхностного и глубокого копирования объектов, которое более подробно будет рассматриваться позже в книге. Следующая глава посвящена способам определения членов классов (таких как свойства и методы), которые позволят повысить знания ООП в С# до уровня, достаточного для разработки реальных приложений. Упражнения 1. Что неверно в приведенном ниже коде? public sealed class MyClass { Члены класса. public class myDerivedClass : MyClass { Члены класса. 2. Как определяются не создаваемые классы? 3. Почему не создаваемые классы все равно являются полезными? Как пользоваться их возможностями? 4. Создайте проект типа библиотеки классов по имени Vehicles и напишите в нем код, реализующий семейство упоминавшихся ранее в этой главе объектов типа Vehicle. Реализовать необходимо девять объектов и два интерфейса. 5. Создайте проект типа консольного приложения по имени Traffic, ссылающийся на проект Vehicles. dll (из упражнения 4). Добавьте в него функцию по имени AddPasenger, принимающую любой объект с интерфейсом IPassengerCarrier. Для доказательства работоспособности кода вызывайте эту функцию с использованием экземпляров всех объектов, которые поддерживают этот интерфейс, вызывая для каждого из них унаследованный от System.Object метод ToString и выводя результат на экран. Определение членов класса В этой главе продолжается изучение определений классов в С#. Выражается оно в описании способов определения членов классов, а именно - полей, свойств и методов. Первым делом анализируется код, который необходимо использовать для определения членов каждого из этих типов, и показывается то, как можно быстро генерировать структуру кода с помощью мастеров, а также то, как быстро изменять код членов, редактируя их свойства. После рассмотрения основных приемов, необходимых для определения членов класса, приводится описание и некоторых более сложных приемов с их участием, вроде сокрытия членов базового класса, вызова переопределенных членов базового класса, определения вложенных типов и определения частичных классов. Напоследок предоставляется возможность применить изученную теорию на практике путем создания простой библиотеки классов, которая будет разрабатываться и использоваться дальше и в последующих главах. В частности, в настоящей главе рассматриваются следующие основные темы. □ Работа с членами классов, а именно - полями, свойствами и методами. □ Создание библиотеки классов. Определение членов В рамках определения класса предоставляются определения для всех его членов, таких как поля, методы и свойства. Каждый член имеет собственный уровень доступности, определяемый во всех случаях с помощью одного из перечисленных ниже ключевых слов. □ public (общедоступный) - делает члены доступными из любого кода. а private (приватный) - делает члены доступными только из того кода, который является частью данного класса (используется по умолчанию, если не указывается никакое ключевое слово).
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |