Студопедия Главная Случайная страница Обратная связь

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

Volatile 10 страница.





В зависимости от наличия или отсутствия методов доступа get и set свойства классифицируются следующим образом.

· Свойство, содержащее оба метода доступа (get и set), называется свойством для чтения и записи.

· Свойство, содержащее только метод доступа get, называется свойством только для чтения. Адресатом назначения является ошибка во время компиляции для свойства только для чтения.

· Свойство, содержащее только метод доступа set, называется свойством только для записи. Свойство, доступное только на запись, может использоваться в выражениях только в качестве конечного объекта операции присваивания. Во всех остальных случаях возникает ошибка времени компиляции.

В примере

public class Button: Control
{
private string caption;

public string Caption {
get {
return caption;
}
set {
if (caption!= value) {
caption = value;
Repaint();
}
}
}

public override void Paint(Graphics g, Rectangle r) {
// Painting code goes here
}
}

элемент управления Button объявляет открытое свойство Caption. Метод доступа get свойства Caption возвращает строку, хранящуюся в закрытом поле caption. Метод доступа set сравнивает новое значение с текущим, и если оно отличается, сохраняет новое значение и обновляет элемент управления. Для свойств часто используется описанный выше шаблон. Метод доступа get просто возвращает значение, хранящееся в закрытом поле, а метод set изменяет закрытое поле и выполняет определенные действия, необходимые для полного обновления состояния объекта.

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

Button okButton = new Button();
okButton.Caption = "OK"; // Invokes set accessor
string s = okButton.Caption; // Invokes get accessor

В этом примере метод доступа set вызывается посредством присваивания значения свойству, а метод доступа get — посредством ссылки на свойство в выражении.

Методы доступа get и set свойства не являются отдельными членами и не могут объявляться отдельно от свойства. Два метода доступа на чтение и запись не могут иметь различные уровни доступа. Пример.

class A
{
private string name;

public string Name { // Error, duplicate member name
get { return name; }
}

public string Name { // Error, duplicate member name
set { name = value; }
}
}

В этом примере не объявляется одно свойство, доступное на чтение и запись. Вместо этого в нем объявляется два одноименных свойства, одно из которых является свойством, доступным только на чтение, а другое — свойством, доступным только на запись. Поскольку два члена, объявленные в одном классе, не могут иметь одинаковые имена, возникает ошибка времени компиляции.

Если имя объявляемого в производном классе свойства совпадает с именем унаследованного свойства, свойство производного класса скрывает унаследованное свойство по отношению к операциям чтения и записи. В примере

class A
{
public int P {
set {...}
}
}

class B: A
{
new public int P {
get {...}
}
}

свойство P класса B скрывает свойство P класса A по отношению к операциям чтения и записи. Таким образом, в операторах

B b = new B();
b.P = 1; // Error, B.P is read-only
((A)b).P = 1; // Ok, reference to A.P

присваивание свойству b.P вызывает ошибку времени компиляции, поскольку свойство только для чтения P класса B скрывает свойство только для записи P класса A. Обратите внимание, что для доступа к скрытому свойству P можно использовать приведение.

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

class Label
{
private int x, y;
private string caption;

public Label(int x, int y, string caption) {
this.x = x;
this.y = y;
this.caption = caption;
}

public int X {
get { return x; }
}

public int Y {
get { return y; }
}

public Point Location {
get { return new Point(x, y); }
}

public string Caption {
get { return caption; }
}
}

В этом примере в классе Label используется два поля типа int (x и y) для хранения местоположения надписи. Сведения о местоположении предоставляются открытым образом в виде свойств X и Y, а также свойства Location типа Point. Если в последующих версиях класса Label потребуется внутреннее хранение данных о местоположении с помощью типа Point, это можно реализовать, не внося изменения в открытый интерфейс класса:

class Label
{
private Point location;
private string caption;

public Label(int x, int y, string caption) {
this.location = new Point(x, y);
this.caption = caption;
}

public int X {
get { return location.x; }
}

public int Y {
get { return location.y; }
}

public Point Location {
get { return location; }
}

public string Caption {
get { return caption; }
}
}

Если бы свойства x и y были полями public только для чтения, внести такие изменения в класс Label было бы невозможно.

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

Поскольку вызов метода доступа get концептуально равнозначен чтению значения поля, не рекомендуется, чтобы при использовании методов доступа get выполнялись видимые побочные действия. Пример.

class Counter
{
private int next;

public int Next {
get { return next++; }
}
}

В этом примере значение свойства Next зависит от числа выполненных обращений к нему. Таким образом, обращение к свойству порождает заметные побочные действия, поэтому в этом случае свойство необходимо реализовывать как метод.

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

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







Дата добавления: 2015-09-07; просмотров: 454. Нарушение авторских прав; Мы поможем в написании вашей работы!




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


Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...


Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...


Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...

Функциональные обязанности медсестры отделения реанимации · Медсестра отделения реанимации обязана осуществлять лечебно-профилактический и гигиенический уход за пациентами...

Определение трудоемкости работ и затрат машинного времени На основании ведомости объемов работ по объекту и норм времени ГЭСН составляется ведомость подсчёта трудоёмкости, затрат машинного времени, потребности в конструкциях, изделиях и материалах (табл...

Гидравлический расчёт трубопроводов Пример 3.4. Вентиляционная труба d=0,1м (100 мм) имеет длину l=100 м. Определить давление, которое должен развивать вентилятор, если расход воздуха, подаваемый по трубе, . Давление на выходе . Местных сопротивлений по пути не имеется. Температура...

Тема: Изучение фенотипов местных сортов растений Цель: расширить знания о задачах современной селекции. Оборудование:пакетики семян различных сортов томатов...

Тема: Составление цепи питания Цель: расширить знания о биотических факторах среды. Оборудование:гербарные растения...

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

Studopedia.info - Студопедия - 2014-2025 год . (0.014 сек.) русская версия | украинская версия