Программирование >>  Обработка исключительных ситуаций 

1 ... 37 38 39 [ 40 ] 41 42 43 ... 142


Листинг 5.9 {продолжение)

Console.WriteLineC Monster {0} \t health = {1 } ammo name, health, ammo ):

string name;

int health, ammo;

закрытые поля

class Classl

static void MainO

Monster X = new MonsterO; X.PassportO;

Monster Vasia = new MonsterC Vasia ); Vasia.PassportO;

Monster Masha = new MonsterC 200, 20 0, Masha ); Masha.PassportO;

3 J.

Результат работы программы:

Monster Noname Monster Vasia Monster Masha

health = 100 ammo = 100 health = 100 ammo = 100 health = 200 ammo = 200

В классе три закрытых поля (name, health и ammo), четыре метода (GetName, GetHealth, GetAmmo и Passport) и три конструктора, позволяющие задать при создании объекта ни одного, один или три параметра.

Свойства

Свойства служат для организации доступа к полям класса. Как правило, свойство связано с закрытым полем класса и определяет методы его получения и установки. Синтаксис свойства:

[ атрибуты ] [ спецификаторы ] тип имясвойства {

[ get коддоступа ] [ set код доступа ]

Значения спецификаторов для свойств и методов аналогичны. Чаще всего свойства объявляются как открытые (со спецификатором public), поскольку они входят в интерфейс объекта.



Свойства

Код доступа представляет собой блоки операторов, которые выполняются при получении (get) или установке (set) свойства. Может отсутствовать либо часть get, либо set, но не обе одновременно.

Если отсутствует часть set, свойство доступно только для чтения (read-only), если отсутствует часть get, свойство доступно только для записи (write-only).

В версии С# 2.0 введена удобная возможность задавать разные уровни доступа для частей get и set. Например, во многих классах возникает потребность обеспечить неограниченный доступ для чтения и ограниченный - для записи.

Спецификаторы доступа для отдельной части должны задавать либо такой же, либо более ограниченный доступ, чем спецификатор доступа для свойства в целом. Например, если свойство описано как publ i с, его части могут иметь любой спецификатор доступа, а если свойство имеет доступ protected internal, его части могут объявляться как internal, protected или private. Синтаксис свойства в версии 2.0 имеет вид

[ атрибуты ] [ спецификаторы ] тип имя свойства {

[ [ атрибуты ] [ [ атрибуты ]

спецификаторы спецификаторы

get код доступа set коддоступа

Пример описания свойств: jjblic class Button: Control

private string caption; public string Caption {

get {

return caption;

set {

if (caption != value) caption = value;

закрытое поле, свойство

способ получения свойства

способ установки свойства

которым связано свойство

ПРИМЕЧАНИЕ

Двоеточие между именами Button и Control в заголовке класса Button означает, что класс Button является производным от класса Control.

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

В программе свойство выглядит как поле класса, например:

Button ok = new ButtonO; :k.Caption = OK ; string s = ok.Caption;

вызывается метод установки свойства вызывается метод получения свойства



При обращении к свойству автоматически вызываются указанные в нем методы чтения и установки.

Синтаксически чтение и запись свойства выглядят почти как методы. Метод get должен содержать оператор return, возвращающий выражение, для типа которого должно существовать неявное преобразование к типу свойства. В методе set используется параметр со стандартным именем value, который содержит устанавливаемое значение.

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

С помощью свойств можно отложить инициализацию поля до того момента, когда оно фактически потребуется, например:

class А

private static ComplexObject x; закрытое поле

public static ComplexObject X свойство

if (х == null) {

x = new ComplexObject(); создание объекта при 1-м обращении return X;

Добавим в класс Monster, описанный в листинге 5.9, свойства, позволяющие работать с закрытыми полями этого класса. Свойство Name сделаем доступным только

5 для чтения, поскольку имя объекта задается в конструкторе и его изменение не

предусмотрено1, в свойствах Health и Anmo введем проверку на положительность устанавливаемой величины. Код класса несколько разрастется, зато упростится его использование.

Листинг 5.10. Класс Monster со свойствами using System;

namespace ConsoleApplication1

class Monster

{ public Monster()

1 Вообще говоря, в данном случае логичнее использовать не свойство, а просто поле со спецификатором readonly. Свойство требуется для демонстрации синтаксиса.



1 ... 37 38 39 [ 40 ] 41 42 43 ... 142

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