Классы, член данные и член функции класса
Класс это абстрактный тип данных, определяемый программистом (пользователем).
С помощью классов определяются свойства объектов. Объекты это экземпляры класса.
Объявление класса синтаксически имеет следующий вид:
сlass имя_класса
{
// члены класса
}
Члены класса – это данные и функции для работы с этими данными.
Имя класса – это, по сути дела, имя нового типа данных.
Создание экземпляра (объекта) класса осуществляется с помощью оператора new:
Имя_класса имя_объекта = new имя_класса();
Доступ к членам класса управляем. Управление доступом осуществляется с помощью спецификаций доступа:
- public – общедоступный член класса.
- private – член класса доступен только внутри данного класса.
- protected – член класса доступен только внутри данного класса и внутри классов, производных от данного.
- internal – член класса доступен только внутри данной сборки.
По умолчанию в классе устанавливается спецификация доступа private. Спецификация доступа, отличная от private, должна указываться явно перед каждым членом класса.
Данные класса подразделяются на поля, константы и события.
Поле – это обычная член-переменная, содержащая некоторое значение.
Можно, например, объявить класс, членами которого являются только поля:
class CA
{
public int x;
protected float z;
double m;
public char sim;
private decimal sum;
}
Обратите внимание, на то, что поле m здесь объявлено по умолчанию приватным.
Константы – это поле, объявленное с модификатором const, или, другими словами это поле, значение которого изменить нельзя, например:
public const int x = 25;
События это члены класса, предназначенные для информирования клиентов класса, что что-то произошло. В данной лабораторной работе события рассматриваться не будут.
Все не статические член функции класса имеют неограниченный доступ ко всем член данным класса независимо от спецификации доступа.
Методы
В основном, с помощью методов класса осуществляется обработка член данных класса. Другими словами, методы определяют поведение экземпляров данного класса. Методы класса это обычные функции С - стиля.
В отличии от функций С, при передаче методу параметров по ссылке, необходимо указывать ключевое слово refили out. Эти ключевые слова сообщают компилятору, что адреса параметров функции совпадают с адресами переменных, передаваемых в качестве параметров. Любое изменение значения параметров в этом случае приведет к изменению и переменных вызывающего кода. Рекомендуется для входного параметра использовать ключевое слово ref,а для выходного параметра ключевое словоout, так какпараметр функции с ключевым словом ref должен быть обязательно проинициализирован перед вызовом функции. При вызове методов указание ключевых слов refи out обязательно. Методы могут быть объявлены с ключевым словом static например:
public static int minabs(ref int x,ref int y)
{
//тело функции
}
В этом случае для вызова метода указывается имя класса, в котором она определена, и через точку имя метода:
Cmin.minabs(ref a,ref b);
Точка в С# означает принадлежность функции данному классу (в нашем случае Cmin).
Для закрепления изложенного материала создайте проект для консоли, введите текст приложения из примера 1.
Скомпилируйте и проанализируйте результаты работы приложения.
Пример 1:
using System;
namespace ConsoleApplication12
{
class Cmin
{
public static int min(int x,int y)
{
int z = (x<y)?x:y;
return z;
}
public static int minabs(ref int x,ref int y)
{
x = (x<0)?-x:x;
y = (y<0)?-y:y;
int z = (x<y)?x:y;
return z;
}
}
class Class1
{
[STAThread]
static void Main(string[] args)
{
int a=-4;
int b=2;
Console.WriteLine("a={0} b={1}",a,b);
int k =Cmin.min(a,b);
Console.WriteLine("a={0} b={1}",a,b);
Console.WriteLine("k="+k);
k =Cmin.minabs(ref a,ref b);
Console.WriteLine("a={0} b={1}",a,b);
Console.WriteLine("k="+k);
}
}
}
Свойства
Свойства в С# состоят из объявления поля и методов-аксессоров для работы с этим полем.
Эти методы- аксессоры называются получатель (get) и установщик (set).
Например, простейшее свойство y, работающее с полем m, можно представить следующим образом:
private int m=35;
public int y
{
get
{
return m;
}
set
{
m=value;
}
}
Свойство, определяется, так же как и поле, но после имени свойства идет блок кода, включающий в себя два метода get и set. Код этих методов может быть сколь угодно сложным, но в нашем случае это всего лишь один оператор. Аксессор get всегда возвращает значение того типа, который указан в определении свойства. Аксессор set всегда принимает в качестве параметра переменную value, которая передается ему неявно. Один из аксессоров может быть опущен, в этом случае мы получаем поле только для чтения или только для записи.
Обращение к свойству осуществляется точно так же как и к полю.
Пример 2:
using System;
namespace ConsoleApplication11
{
class CStatic
{
private int m=35;
public int y
{
get
{
return m;
}
set
{
m=value;
}
}
}
class Class1
{
[STAThread]
static void Main(string[] args)
{
// TODO: Add code to start application here
CStatic p=new CStatic();//создается экземпляр класса
Console.WriteLine("{0}",p.y);
p.y=75;
int z = p.y;
Console.WriteLine("{0}",z);
}
}
}
Введите текст программы из примера 2, скомпилируйте и проанализируйте работу приложения.
Индексаторы
Индексаторы позволяют приложению обращаться с объектом класса так, как будто он является массивом. Индексатор во многом напоминает свойство, но в отличие от свойства он принимает в качестве параметра индекс массива. Так как объект класса используется как массив, то в качестве имени класса используется ключевое слово this.
Пример 3:
using System;
namespace ConsoleApplication13
{
class Rmas
{
protected float[] msf=new float[10];
public float this[int j]
{
get
{
return msf[j];
}
set
{
msf[j]=value;
}
}
}
class Class1
{
static void Main(string[] args)
{
Rmas obj = new Rmas();
for(int i=0; i<10;i++)
{
obj[i] = (float)1.5*i;
}
for(int i=0; i<10;i++)
{
Console.WriteLine("{0}",obj[i]);
}
}
}
}
Вопросы:
1. Как объявляется класс?
2. Разрешается ли в объявлении структуры и класса инициализировать их член – данные?
3. Какие спецификации используются в классе и структуре для управления доступом к членам класса?
4. Чем отличаются по своему действию спецификации private от protected?
5. Какая спецификация доступа к данным устанавливается по умолчанию, при объявлении класса?
6. Какая спецификация доступа к данным устанавливается по умолчанию, при объявлении структуры?
7. Чем отличается передача параметров методам с помощью модификатора ref от передачи параметров методам с помощью модификатора out?
8. Чем отличается обращение к статическим методам класса от обращения к не статическим методам?
9. Что такое свойство?
10. Сколько свойств может быть объявлено в классе?
11. Может ли свойство использоваться для работы сразу с несколькими полями?
12. Сколько индексаторов может быть объявлено в классе для работы, например, с одномерными массивами?
13. Почему индексаторы называют интеллектуальными массивами?
Задания:
1. Введите текст программ из примеров 1,2.3, скомпилируйте и проанализируйте работу приложений.
2. Объявить класс, содержащий два поля целого типа, свойства для работы с этими полями, а также статическую функцию. Функция принимает два параметра целого типа и осуществляет обмен значений этих параметров. Создать объект этого класса. Ввести с клавиатуры два числа и присвоить значения этих чисел полям объекта. Распечатать поля объекта. Осуществить обмен значений полей объекта и вновь распечатать поля объекта.
3. Объявить класс, содержащий два поля целого типа, свойства для работы с этими полями, а также функцию. Функция возвращает сумму значений полей класса. Создать объект этого класса. Ввести с клавиатуры два числа и присвоить значения этих чисел полям объекта. Распечатать поля объекта и их сумму.
4. Объявить класс, содержащий одномерный целочисленный массив размерностью 5, индексатор для работы с этим массивом, а также функцию, для определения минимального и максимального элемента этого массива. Для хранения минимального и максимального значения предусмотреть два поля класса и свойства только для чтения этих полей. Создать объект этого класса. Ввести с клавиатуры элементы массива объекта. Распечатать элементы массива объекта, минимальное и максимальное значение массива.
5. Объявить класс, содержащий одномерный целочисленный массив размерностью 5, индексатор для работы с этим массивом, а также функцию, для определения суммы и средне - арифметического значения элементов этого массива. Для хранения суммы и среднего значения предусмотреть два поля класса и свойства только для чтения этих полей. Создать объект этого класса. Ввести с клавиатуры элементы массива объекта. Распечатать элементы массива объекта, суммы и средне - арифметического значение массива.
6. Объявить класс, содержащий одномерный целочисленный массив размерностью 5, индексатор для работы с этим массивом, а также функцию, для сортировки элементов этого массива в порядке возрастания. Класс также должен содержать поля для минимального и максимального элемента массива, а также свойства только для чтения этих полей. Значения этих полей определяются в результате работы функции сортировки. Создать объект этого класса. Ввести с клавиатуры элементы массива объекта. Распечатать элементы массива объекта, минимальное и максимальное значение массива.
7. Объявить класс, содержащий одномерный целочисленный массив размерностью 5, индексатор для работы с этим массивом, а также функцию, для сортировки элементов этого массива в порядке убывания. Класс также должен содержать поля для минимального и максимального элемента массива, а также свойства только для чтения этих полей. Значения этих полей определяются в результате работы функции сортировки. Создать объект этого класса. Ввести с клавиатуры элементы массива объекта. Распечатать элементы массива объекта, минимальное и максимальное значение массива.
8. Объявить класс, содержащий одномерный целочисленный массив размерностью 5, индексатор для работы с этим массивом. Создать три объекта данного класса. Ввести с клавиатуры элементы массива для первого и второго объекта. Элементы массива третьего объекта получить путем суммирования соответствующих элементов массивов первого и второго объектов. Распечатать массив третьего объекта.
9. Объявить класс, содержащий одномерный целочисленный массив размерностью 10, индексатор для работы с этим массивом. Создать объект данного класса. Ввести с клавиатуры элементы массива объекта. Найти элемент массива наиболее близкий по своему значению средне арифметическому значению элементов массива. Распечатать значение этого элемента и его индекс.
10. Объявить класс, содержащий одномерный целочисленный массив размерностью 5, индексатор для работы с этим массивом. Создать три объекта данного класса. Ввести с клавиатуры элементы массива для первого и второго объекта. Элементы массива третьего объекта получить путем сравнения соответствующих элементов массивов первого и второго объектов и выбора наибольшего. Распечатать массив третьего объекта.
Лабораторная работа № 3