Студопедия — Необходимые теоретические сведения. Формально класс – это пользовательский тип, состоящий из полей данных и методов, которые работают с этими данными
Студопедия Главная Случайная страница Обратная связь

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

Необходимые теоретические сведения. Формально класс – это пользовательский тип, состоящий из полей данных и методов, которые работают с этими данными






Классы и объекты

Формально класс – это пользовательский тип, состоящий из полей данных и методов, которые работают с этими данными. Множество полей данных представляет «состояние» экземпляра класса. Экземпляры класса иначе называются объектами.

Сила объектно-ориентированных языков состоит в том, что в одном пользовательском типе за счет группировки данных и функциональности вы можете смоделировать поведение некоторой сущности реального мира. Например, чтобы смоделировать сотрудника в системе расчета зарплаты, необходимо создать класс, содержащий имя, текущую зарплату и идентификатор (табельный номер). Кроме того, класс Employee должен содержать методы GiveBonus() для начисления премии и DisplayStats() для вывода информации о сотруднике.

Синтаксис класса:

тип_доступа class имя_класса

{

тип_доступа тип имя_переменной1;

тип_доступа тип имя_переменной2;

тип_доступа возвращаемый_тип имя_метода1(список_параметров)

{

тело_метода

}

...

}

Модификаторы доступа определяют поле видимости данного класса. Для классов предназначены два модификатора или типа доступа:

· public ­– класс доступен для других компонент(сборок);

· internal – класс видим только внутри данной сборки (приложения).

По умолчанию применяется модификатор internal. Модификаторы доступа также указываются и перед полями и методами класса: private (по умолчанию), public, protected, internal и protected internal. Члены класса с типом доступа public доступны везде за пределами данного класса, с типом доступа protected – внутри членов данного класса и производных, с типом доступа private - только для других членов данного класса. Тип доступа internal применяется для типов, доступных в пределах одной сборки.

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

Все классы имеют конструкторы независимо от того, определен он или нет. По умолчанию в С# предусмотрено наличие конструктора, который присваивает нулевые значения всем переменным экземпляра (для переменных обычных типов) и значения null (для переменных ссылочного типа). Но если конструктор явно определен в классе, то конструктор по умолчанию использоваться не будет. Приведем пример создания класса Employee, описанного выше.

public class Employee

{

private string fullName; // Имя сотрудника

private int empID; // табельный номер

private float currPay; // зарплата

// Конструктор по умолчанию

public Employee(){}

// Пользовательский конструктор

public Employee(string FullName, int empID, float currPay)

{

this.fullName = FullName;

this.empID = empID;

this.currPay = currPay;

}

// Еще один пользовательский конструктор с одним параметром,

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

public Employee(string fullName)

: this(fullName, 3333, 0.0F){}

// Методы класса

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. Это могут быть поля данных, константы/поля только для чтения, методы, свойства.

 

Инкапсуляция на основе свойств класса

Во всех объектно-ориентированных языках используются три основных принципа ООП, которые часто называют «столпами ООП»: инкапсуляция(реализованный в данном языке механизм скрытия внутренней реализации объекта), наследование(реализованный в данном языке механизм многократного использования кода), полиморфизм(реализованный в данном языке механизм трактовки связанных объектов одинаковым образом).

Концепция инкапсуляции вращается вокруг идеи, что поля данных объекта не должны быть доступными непосредственно через открытый интерфейс. Вместо определения открытых полей(которые пользователь может непреднамеренно изменить недопустимым образом, из-за чего произойдёт сбой в работе программы) определяются закрытые поля данных и связанные с ними свойства. Свойство – пара методов со специальными именами. Метод set() вызывается при задании значения свойства, метод get() – при получении значения свойства. Обращение к свойству выглядит как обращение к полю данных, но транслируется в вызов одного из двух методов. Определяя в свойстве только один из двух методов, получаем свойства только для чтения и для записи. Каждый из методов может иметь модификатор доступа. Приведем пример для класса Employee: свойство Pay инкапсулирует поле currPay, свойство ID – поле empID, свойство Name инкапсулирует поле fullName.

public class Employee

{

private string fullName; // Имя сотрудника

private int empID; // табельный номер

private float currPay; // зарплата

....

// свойство для поля empID

public int ID

{

get { return empID; }

set { // проверка значения на корректность

if((value >0)&&(value < 9999))

empID = value;

else {

empID = 3333;

Console.WriteLine(“Задано значение по умолчанию”);

}

}

}

//Свойство для поля currPay.

public float Pay

{

get {return currPay;}

set { if((value >=0)&&(value < 100 000))

currPay = value;

else currPay =0;

}

}

// Свойство для поля fullName.

public string Name

{

get { return fullName; }

set { fullName = value; } // здесь должна быть проверка на допустимость

}

……

} // к классу Employee

Создание объекта

При создании обьекта класса происходит вызов соответствующего конструктора. Следующий метод Main() создаёт несколько объектов Employee, используя наши пользовательские конструкторы и демонстрирует работу с свойствами класса.

class Program

{

static void Main(string[] args)

{

// Создание сотрудника пользовательским конструктором

Employee ann = new Employee(“Ivanova Anna I.”, 1001, 12000.0f);

ann.GiveBonus(400);

ann.DisplayStats();

Employee piter = new Employee(“Petrov Petr A.”, 1002, 14000.0f);

piter.DisplayStats();

// Использование конструктора по умолчанию и свойств

Employee brenner = new Employee();

brenner.ID = 2022;

brenner.Pay = 7500;

brenner.Name = “Smirnov Boris P.”;

brenner.Pay += 500;

brenner.DisplayStats();

}

}

Перегрузка операторов C#

Язык C# позволяет выполнять перегрузку операторов для их использования в собственных классах. Это позволяет добиться естественного вида определяемого пользователем типа данных и использовать его в качестве основного типа данных. Например, можно создать новый тип данных с именем ComplexNumber, представляющий комплексное число, и определить методы выполнения математических операций над такими числами с использованием стандартных арифметических операторов, например оператора + для сложения двух комплексных чисел.

Чтобы выполнить перегрузку оператора, необходимо написать функцию с указанием имени оператора, а затем символа оператора, для которого выполняется перегрузка. Например, так выполняется перегрузка оператора +:

public static ComplexNumber operator+(ComplexNumber a, ComplexNumber b)

Все перегрузки операторов являются статическими методами класса. Кроме того, следует учесть, что если перегружается оператор равенства (==), то необходимо перегрузить и оператор неравенства (!=). Операторы < и >, а также <= и >= тоже следует перегружать парами.

Ниже приведен полный список операторов, которые можно перегрузить:

· Унарные операторы: +, -,!, ~, ++, --, true, false

· Бинарные операторы: +, -, *, /, %, &, |, ^, <<, >>;, ==, !=, >;, <;, >=, <=

Приведенный ниже пример кода создает класс ComplexNumber, который перегружает операторы + и -:

public class ComplexNumber

{

private int real;

private int imaginary;

public ComplexNumber(): this(0, 0) //конструктор

{ }

public ComplexNumber(int r, int i) // конструктор

{

real = r;

imaginary = i;

}

// Перекрытие метода ToString(), чтобы выводить комплексное число в
// привычной форме:

public override string ToString()

{

return(System.String.Format("{0} + {1}i", real, imaginary));

}

// Перегрузка оператора '+':

public static ComplexNumber operator+(ComplexNumber a, ComplexNumber b)

{

return new ComplexNumber(a.real + b.real, a.imaginary + b.imaginary);

}

//Перегрузка оператора '-':

public static ComplexNumber operator-(ComplexNumber a, ComplexNumber b)

{

return new ComplexNumber(a.real - b.real, a.imaginary - b.imaginary);

}

}

Этот класс позволяет создавать комплексные числа и выполнять операции с двумя комплексными числами:

class TestComplexNumber

{

static void Main()

{

ComplexNumber a = new ComplexNumber(10, 12);

ComplexNumber b = new ComplexNumber(8, 9);

System.Console.WriteLine("Complex Number a = {0}", a.ToString());

System.Console.WriteLine("Complex Number b = {0}", b.ToString());

ComplexNumber sum = a + b;

System.Console.WriteLine("Complex Number sum = {0}", sum.ToString());

ComplexNumber difference = a - b;

System.Console.WriteLine("Complex Number difference = {0}", difference.ToString());

}

}

Как наглядно показано в программе, теперь можно использовать операторы "плюс" и "минус" для объектов, принадлежащих к классу ComplexNumber. Ниже приведены выходные данные:

Complex Number a = 10 + 12i

Complex Number b = 8 + 9i

Complex Number sum = 18 + 21i

Complex Number difference = 2 + 3i

Контрольные вопросы

1) Что понимается под термином «класс»?

2) Какие элементы определяются в составе класса?

3) Каково соотношение понятий «класс» и «объект»?

4) Что понимается под термином «члены класса»? Какие члены класса Вам известны?

5) Какие члены класса содержат код, а какие данные?

6) Дайте определение инкапсуляции.

7) С какой целью используются свойства класса?

8) Перечислите пять разновидностей членов класса специфичных для языка C#.

9) Что понимается под термином «конструктор»? В чем состоит его назначение?

10) Сколько конструкторов может содержать класс языка C#?

11) Приведите синтаксис описания класса в общем виде. Проиллюстрируйте его фрагментом программы на языке C#.

12) Какие модификаторы типа доступа Вам известны?

13) В чем заключаются особенности доступа членов класса с модификатором public? private? с модификатором protected? internal?

14) Каждый ли класс языка C# имеет конструктор?

15) Зачем необходимо перегружать операции?

 







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



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

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

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

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

Типовые ситуационные задачи. Задача 1. Больной К., 38 лет, шахтер по профессии, во время планового медицинского осмотра предъявил жалобы на появление одышки при значительной физической   Задача 1. Больной К., 38 лет, шахтер по профессии, во время планового медицинского осмотра предъявил жалобы на появление одышки при значительной физической нагрузке. Из медицинской книжки установлено, что он страдает врожденным пороком сердца....

Типовые ситуационные задачи. Задача 1.У больного А., 20 лет, с детства отмечается повышенное АД, уровень которого в настоящее время составляет 180-200/110-120 мм рт Задача 1.У больного А., 20 лет, с детства отмечается повышенное АД, уровень которого в настоящее время составляет 180-200/110-120 мм рт. ст. Влияние психоэмоциональных факторов отсутствует. Колебаний АД практически нет. Головной боли нет. Нормализовать...

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

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

Классификация и основные элементы конструкций теплового оборудования Многообразие способов тепловой обработки продуктов предопределяет широкую номенклатуру тепловых аппаратов...

Именные части речи, их общие и отличительные признаки Именные части речи в русском языке — это имя существительное, имя прилагательное, имя числительное, местоимение...

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