Программирование >>  Программирование с использованием ajax 

1 ... 66 67 68 [ 69 ] 70 71 72 ... 396



Определение классов

В главе 8 рассматривались теоретические аспекты объектно-ориентированного программирования (ООП). В этой главе предоставляется возможность применить теорию на практике и, в частности, увидеть то, как определяются классы в С#. Способы определения членов классов здесь не рассматриваются, потому что все основное внимание уделяется способам определения самих классов. Может показаться, что такой подход является несколько ограниченным, но не стоит волноваться - материла для изучения здесь более чем достаточно.

Сначала рассматривается синтаксис, необходимый для определения базовых классов, ключевые слова, которые можно использовать для указания доступности класса и не только, а также способ, которым можно задавать наследование. Также рассказывается и об определениях интерфейсов, поскольку они во многом похожи на определения классов.

В остальной части настоящей главы освещены другие родственные вопросы, имеющие отношение к определению классов в языке С#.

□ Класс System. Ob j ect.

□ Полезные средства, предоставляемые VS и VCE.

□ Библиотеки классов.

□ Сравнение интерфейсов и абстрактных классов.

□ Типы-структуры.

□ Копирование объектов.

Определение классов в С#

В языке С# для определения классов применяется ключевое слово class:

class MyClass {



В этом коде определяется класс по имени MyClass. После определения класса его экземпляр можно создавать в любом месте проекта, где имеется доступ к этому определению. По умолчанию классы объявляются внутренними, что делает их доступными только для кода, который находится внутри текущего проекта. Объявлять их таковыми можно явно с использованием ключевого слова internal, как показано ниже (хотя делать это не обязательно):

internal class MyClass

Члены класса.

В качестве альтернативного варианта можно указывать, что класс является общедоступным и должен быть также доступен и в коде других проектов. Для этого нужно использовать ключевое слово public, как показано ниже:

public class MyClass

Члены класса.

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

Помимо этих двух ключевых слов, играющих роль модификаторов доступа, можно использовать либо ключевое слово abstract и тем самым делать класс абстрактным (т.е. не допускающим создания экземпляров, позволяющим только наследовать от него другие классы и способным иметь абстрактные члены), либо ключевое слово sealed и тем самым сделать класс герметизированным (не допускающим наследования от него никаких других классов). Эти два ключевых слова являются взаимно исключающими, т.е. указывать можно только какое-то одно из них. В частности, абстрактный класс объявляется следующим образом:

public abstract class MyClass

Члены класса, могут быть и абстрактными.

Здесь MyClass представляет собой общедоступный абстрактный класс, хотя внутренние абстрактные классы тоже допускается создавать.

Герметизированные классы объявляются следующим образом:

public sealed class MyClass

Члены класса.

Подобно абстрактным, герметизированные классы могут быть как общедоступными, так и внутренними.

Наследование тоже может задаваться в определении класса. Делается это добавлением после имени класса двоеточия со следующим за ним именем базового класса, как показано ниже:

public class MyClass : MyBase



В определениях классов разрешено указывать только один базовый класс и в случае наследования от абстрактного класса нужно обязательно реализовать все наследуемые абстрактные члены (если только производный класс тоже не является абстрактным).

Компилятор не допускает, чтобы производный класс был более доступным, чем его базовый класс. Это означает, что внутренний класс может наследоваться от общедоступного класса, а вот общедоступный класс от внутреннего базового - нет. То есть следующий код является допустимым:

public class MyBase

Члены класса.

internal class MyClass : MyBase

Члены класса.

A приведенный ниже код скомпилировать не удастся:

internal class MyBase

Члены класса.

public class MyClass : MyBase

Члены класса.

Если базовый класс не используется, класс наследуется только от базового класса System.Object (который в С# имеет псевдоним object). В конечном счете, класс System.Object является корневым в иерархии наследования абсолютно всех классов. Об этом фундаментальном классе более подробно рассказываться позже в главе.

Помимо базовых классов подобным образом после двоеточия могут также указываться и поддерживаемые интерфейсы. Если специфицируется базовый класс, он должен указываться после двоеточия первым, а интерфейсы - уже за ним. Если же никакого базового класса не задано, тогда интерфейсы указываются сразу же после двоеточия. Для разделения имен базового класса (если таковой задан) и интерфейсов служат запятые.

Например, в определение класса MyClass добавить интерфейс можно было бы следующим образом:

public class MyClass : IMylnterface

Члены класса.

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

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

public class MyClass : IMylnterface, MyBase {



1 ... 66 67 68 [ 69 ] 70 71 72 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика