Public void GiveBonus(float amount)

{ currPay += amount; }

// Метод для вывода сведений о текущем состоянии объекта

public virtual void DisplayStats() {

Console. WriteLine("Name: {0}", fullName):

Console.WriteLine(“Pay: {0}", currPay):

Console.WriteLine(“ID: {0}", empID);

}

}

public static void Main() {

Employee e = new Employee(“Joe", 80, 30000);

e.GiveBonus(200):

Employee e2:

e2 = new Employee("Beth", 81, 50000);

e2.GiveBonus(1000);

e2.DisplayStats():

}

 

Таблица 2.1 – Модификаторы доступа к членам классов

Модификатор доступа Описание
public Член доступен вне определения класса и иерархии производных классов.
protected Член невидим за пределами класса, к нему могут обращаться только производные классы.
private Член недоступен за пределами области видимости определяющего его класса. Поэтому доступа к этим членам нет даже у производных классов.
internal Член видим только в пределах текущей единицы компиляции. Модификатор доступа internal в плане ограничения доступа является гибридом public и protected, зависимым от местоположения кода.

 

Методы-свойства

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

· чтение, запись (Read, Write);

· чтение, запись при первом обращении (Read, Write-once);

· только чтение (Read-only);

· только запись (Write-only);

· ни чтения, ни записи (Not Read, Not Write).

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

Рассмотрим класс Person, у которого пять полей: fam, status, salary, age, health, характеризующих соответственно фамилию, статус, зарплату, возраст и здоровье персоны. Для каждого из этих полей может быть разумной своя стратегия доступа. Возраст доступен для чтения и записи, фамилию можно задать только один раз, статус можно только читать, зарплата недоступна для чтения, а здоровье закрыто для доступа и только специальные методы класса могут сообщать некоторую информацию о здоровье персоны:

 

// Программа 2. Свойства в класса на C#

public class Person {

//поля (все закрыты)

string fam="", status="", health="";

int age=0, salary=0;

//стратегия: Read,Write-once

public string Fam {

set {if (fam == "") fam = value;}

get {return(fam);}

}

//стратегия: Read-only

public string Status {

get {return(status);}

}

//стратегия: Read,Write

public int Age {

set {

age = value;

if(age < 7) status ="ребенок";

else if(age <17) status ="школьник";

else if (age < 22) status = "студент";

else status = "служащий";

}

get {return(age);}

}

//стратегия: Write-only

public int Salary {

set {salary = value;}

}

}

public void TestPersonProps(){

Person pers1 = new Person();

pers1.Fam = "Петров";

pers1.Age = 21;

pers1.Salary = 1000;

Console.WriteLine ("Фам={0}, возраст={1}, статус={2}", pers1.Fam, pers1.Age, pers1.Status);

pers1.Fam = "Иванов"; pers1.Age += 1;

Console.WriteLine ("Фам={0}, возраст={1}, статус={2}", pers1.Fam, pers1.Age, pers1.Status);

}

Индексаторы

Метод-индексатор обеспечивает доступ к закрытому полю, представляющему массив. Объекты класса индексируются по этому полю. Синтаксически объявление индексатора - такое же, как и в случае свойств, но методы get и set приобретают аргументы по числу размерности массива, задающего индексы элемента, значение которого читается или обновляется. Важным ограничением является то, что у класса может быть только один индексатор и у этого индексатора стандартное имя this. Добавим в класс Person свойство children, задающее детей персоны, сделаем это свойство закрытым, а доступ к нему обеспечит индексатор:

 

// Программа 3. Индексаторы в класса на C#

…..

const int Child_Max = 10; //максимальное число детей

Person[] children = new Person[Child_Max];

int count_children=0; //число детей

public Person this[int i] { //индексатор

get {

if (i>=0 && i< count_children) return(children[i]);

else return(children[0]);

}

set {

if (i==count_children && i< Child_Max) {

children[i] = value; count_children++;

}

}

}

public void TestPersonChildren(){

Person pers1 = new Person(), pers2 = new Person();

pers1.Fam = "Петров"; pers1.Age = 42; pers1.Salary = 10000;

pers1[pers1.Count_children] = pers2;

pers2.Fam ="Петров"; pers2.Age = 21; pers2.Salary = 1000;

Person pers3= new Person("Петрова");

pers1[pers1.Count_children] = pers3;

pers3.Fam ="Петрова"; pers3.Age = 5;

Console.WriteLine ("Фам={0}, возраст={1}, статус={2}", pers1.Fam, pers1.Age, pers1.Status);

Console.WriteLine ("Сын={0}, возраст={1}, статус={2}", pers1[0].Fam, pers1[0].Age, pers1[0].Status);

Console.WriteLine ("Дочь={0}, возраст={1}, статус={2}", pers1[1].Fam, pers1[1].Age, pers1[1].Status);

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: