Лабораторная работа № 11
МЕТОДЫ
Цель и порядок работы
Цель работы – познакомиться с правилами организации методов пользовательских классов, получить практические навыки их построения.
Порядок выполнения работы:
· ознакомиться с описанием лабораторной работы;
· получить задание у преподавателя по вариантам;
· написать программу, использующую в соответствии с заданием методы пользовательского класса;
· ввести программу, отладить и выполнить ее на ЭВМ;
· оформить отчет.
·
Общие сведения
В предыдущей главе было упомянуто, что реализация механизма подпрограмм в C# возложена на функциональный член класса, который именуется методом иреализует вычисления или другие действия, выполняемые классом или экземпляром. Методы определяют поведение класса. Он представляет собой логически завершенный фрагмент кода, к которому обращаются по имени. Он описывается один раз, а вызываться может столько раз, сколько необходимо. Один и тот же метод может обрабатывать различные данные, переданные ему в качестве аргументов.
Описание метода
Ниже представлено синтаксическое описание метода, где определены основные его элементы:
[ атрибуты ] [ спецификаторы ] тип имя_метода ([ параметры ])
тело_метода
Напомним, что необязательные элементы в таких синтаксических конструкциях заключаются в квадратные скобки. К ним относятся атрибуты, спецификаторы, параметры.
В данном описании, прежде всего, необходимо выделить две главные его части: заголовок метода (первая строка) итело метода, в котором задаются действия, выполняемые методом.
Тело метода, как правило, представляет собой блок — последовательность операторов в фигурных скобках.
Обязательными элементами описания метода являются имя метода, его тип, а также тело метода.
Имя метода задается согласно уже рассмотренным ранее правилам. Тело метода реализует, как было сказано выше, некие возложенные на него действия.
Тип вычисляемого методом значения указывается явно перед именем метода. Работа метода завершается выполнением оператора return, расположенного в теле метода и порождающего возврат в то место вызывающего блока, откуда он был вызван. При этом в точку возврата передается вычисленное в процессе выполнения метода значение.
Если метод не возвращает никакого значения, в его заголовке должен присутствовать тип void, а оператор return в теле метода - отсутствовать.
Спецификаторы, используемые при описании методов, и их смысл совпадают с уже рассмотренными в предыдущей теме спецификаторами для полей. В эту совокупность добавлены спецификаторы virtual, sealed, override, abstract и extern.
Поскольку методы – это те члены класса, которые ориентированы на применение пользователями, их спецификатор доступа, как правило, задается public.
Пример простейшего метода:
public double Gety()
{
return y;
}
Метод, хоть и представляет собой фрагмент законченного кода, но должен иметь возможность не только возвращать в точку вызова вычисленное значение, но и получать для своей работы исходную информацию - значения аргументов. Для обмена информацией с методом служат параметры.
Параметры, описываемые в заголовке метода и определяют множество аргументов, значения которых можно передавать в метод. В методе параметр представляет собой локальную переменную, которая при вызове метода принимает значение соответствующего аргумента. Область действия параметра — весь метод.
Вызов метода осуществляется следующим образом:
имя_метода ([ аргументы ])
Список аргументов при вызове как бы накладывается на список параметров, поэтому программист должен следить и за смысловым совпадением, и за согласованным соответствием типов в паре параметр-аргумент друг другу. Метод, возвращающий значение, вызывается в составе выражения в правой части оператора присваивания. Метод, не возвращающий значение, вызывается отдельным оператором.
При описании метода для каждого параметра должны задаваться его тип и имя. Например, заголовок метода Sin выглядит следующим образом:
public static double Sin(double a);
Конструкция:
имя_метода ([ параметры ])
представляет собой сигнатуру метода. В понятие «сигнатура метода» входит количество, типы и спецификаторы его параметров. В классе не должно быть методов с одинаковыми сигнатурами.
Например, чтобы вычислить значение синуса для вещественной величины х, мы передаем ее в качестве аргумента в метод Sin класса Math, а чтобы вывести значение этой переменной на экран, мы передаем ее в метод
WriteLine класса Соnsole:
double х = 0.1;
double у = Маth.Sin(х);
Console.WriteLine(х);
При этом метод Sin возвращает в точку своего вызова вещественное значение синуса, которое присваивается переменной у, а метод WriteLine ничего не возвращает.
В листинге 1 в класс Demо добавлены методы установки и получения значения поля у (на самом деле для подобных целей используются не методы, а свойства, которые рассматриваются чуть позже). Кроме того, статическое поле s закрыто, то есть определено по умолчанию как privatе, а для его получения описан метод Gets, являющий собою пример статического метода.
Листинг 1- Простейшие методы
using System;
namespace ConsoleApplication1
{
class Demo
{
рublic int a= 1;
рublic const double с = 1.66;
static string s = "Demо";
double у;
рublic double Getу() / / метод получения поля у
{
return у;
}
рublic void Sety(double у_) / / метод установки поля у
{
y = y_;
}
рublic static string Gets() / / метод получения поля s
{
return s;
}
}
class Class1 { static void Main()
{
Demo x = new Demo();
x.Sety(0.12); / / вызов метода установки поля у
Соnsole.WriteLine(х.Getу()); / / вызов метода получения поля у
Соnsole.WriteLinе(Demo.Gets()); / / вызов метода получения поля s
Соnsole.WriteLine(Gets()); / / при вызове из др. метода этого объекта
}
}
}
Как видим, методы класса имеют непосредственный доступ к его закрытым полям. Метод, описанный со спецификатором static, должен обращаться только к статическим полям класса. Обратите внимание на то, что статический метод вызывается через имя класса, а обычный — через имя экземпляра.
При вызове метода из другого метода того же класса имя класса/экземпляра можно не указывать.