Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы ООАП.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
735.74 Кб
Скачать

19. Аксессоры доступа к закрытым компонентам класса.

Свойство в Си-шарп – это член класса, который предоставляет удобный механизм доступа к полю класса (чтение поля и запись). Свойство представляет собой что-то среднее между полем и методом класса. При использовании свойства, мы обращаемся к нему, как к полю класса, но на самом деле компилятор преобразовывает это обращение к вызову соответствующего неявного метода. Такой метод называется аксессор (accessor). Существует два таких метода: get (для получения данных) и set(для записи). Объявление простого свойства имеет следующую структуру:

[модификатор доступа] [тип] [имя_свойства] {    get    {      // тело аксессора для чтения из поля    }    set     {      // тело аксессора для записи в поле    } }

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

class Student {    private int year; //объявление закрытого поля    public int Year //объявление свойства    {      get // аксессор чтения поля      {        return year;      }      set // аксессор записи в поле      {        if (value < 1)          year = 1;        else if (value > 5)          year = 5;        else year = value;      }    } } class Program {     static void Main(string[] args)    {      Student st1 = new Student();      st1.Year = 0; // записываем в поле, используя аксессор set     Console.WriteLine(st1.Year); // читаем поле, используя аксессор get, выведет 1      Console.ReadKey();    }  }

Проще говоря, в свойстве реализуются два метода. В теле аксессора getможет быть более сложная логика доступа, но в итоге должно возвращаться значение поля, либо другое значение с помощью оператора return. В аксессоре set же присутствует неявный параметр value, который содержит значение, присваиваемое свойству (в примере выше, при записи, значениеvalue равно «0»).

20. Статические компоненты класса: назначение, особенности и примеры использования.

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

static тип имя_статического_компонентного_данного;

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

тип имя_класса :: имя_статического_компонентного_данного=выражение;

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

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

Так как память под статический элемент данных выделяется еще до определения объектов, существует еще один способ обращения к нему:

имя_класса :: имя_статического_компонентного_данного

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

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

В приведенном ниже листинге 12 статическое компонентное данное count будет подсчитывать количество созданных экземпляров класса. В конструкторе при создании каждого нового объекта значение count будет увеличиваться на 1, а в деструкторе – уменьшаться на 1 при уничтожении объекта.

//Листинг 12. Статические компоненты класса

class MyClass

{ public:

//определяем статический компонент

static int count;

MyClass()

{

count++;

…}

~MyClass()

{ count--;

}

};

//инициализация статического компонента

int MyClass::count=0;

main()

{

MyClass c1();

MyClass *c2=new MyClass();

cout<<MyClass::count; //вывод числа 2

//допустимо и cout<<c1.count;

}

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

имя_класса :: имя_статического_метода ( список_фактических_парамет-

ров )

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]