Обмен данными между методами
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

При рассмотрении данного вопроса взаимодействие между методами упрощено – рассматриваем вариант, когда все методы расположены в одном классе.

Существует 3 способа обмена данными:

1. Использование общих полей класса (рассмотренный ранее вариант)

2. Обмен данными через параметры методов

3. Возврат данных из метода

 

Обмен данными через параметры методов

При определении метода указываются параметры, для каждого параметра указывается тип и имя. При вызове метода указываются аргументы. Значения аргументов будут подставлены вместо параметров (попарно, слева направо). Аргументом может быть любое выражение, тип которого совпадает с типом параметра или может быть автоматически преобразован к типу параметра.

Виды параметров:

1. Входные (прием данных) – при вызове снимается копия аргумента и передается в метод на место параметра. Метод не имеет возможности изменить аргумент. По умолчанию все параметры считаются входными.

2. Выходные – при вызове в метод передается ссылка на область памяти, где хранится аргумент. Метод обрабатывает данные по этой ссылке, т.е. работает с оригиналом аргумента. Выходные параметры при определении метода и вызове метода должны иметь модификатор out.

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

При использовании выходных параметров аргумент должен быть именем объекта.

 

Возврат объекта из метода

При определении метода указывается тип возвращаемого из метода объекта. Возврат значения выполняется оператором return Объект;

Оператор прекращает выполнение метода и производит возврат в точку выова метод и возвращает в вызвавший метод на место вызова – выражение.

Выражение может определить выражение любого типа, т.е. из метода можно вернуть:

1. Значение стандартного типа (целые, вещественные и т.д.)

2. Массив

3. Объект определенного класса

Последние два варианта позволяют добиться возврата из метода множества значений.

Пример:

Определить метод, выполняющий сдвиг координат точки на заданное расстояние.

class_Example

{

public_static_void_Mov (ref int x, ref int y, int d)

{

x=x+d;

y=y+d;

}

 

public_static_void_Main()

{

int a=4, b=3, d=10;

Move (ref a, ref b, d);

}

}

Параметры метода Main ()

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

 

 


С другой стороны сама программа может быть запущена из другой программы и может запускать другую программу.

В рамках данного вопроса рассмотрим вариант, когда программа запускается из среды исполнения. Поскольку метод Main() выполняется первым при запуске программы, то именно через этот метод производится прием аргументов.

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

 

 


C:\PR\PR\BIN\DEBUG\pr.exe_аргумент1_ аргумент2_... _аргументN

 

Состав параметров метода Main фиксирован: Main (string[] args)

Метод принимает параметры из команды в виде массива строк. Каждая строка хранит символьное представление одного аргумента.



Пример

Разработать программу, предназначенную для хранения в виде массива цен на товары и их изменения на заданную сумму. Изменение выполняется методами

· Plus – увеличение

· Minus – уменьшение

Исполняемый файл хранится в файле pr.exe.

Соглашение об аргументах в команде

1. Сумма

2. Вид операции

· Плюс (в любом регистре) или +

· Минус (в любом регистре) или

3. Фамилия оператора (ключ)

Пример команды

C:\PR\PR\BIN\DEBUG\pr.exe_50_Плюс_Иванов

 

Массив args в Main()

 

 

public static void Plus(double[] p, double s)

   // массив цен, сумма, на которую увеличиваем

   {

       for (int i = 0; i < p.Length; i++)

           p[i] += s;

   }

   public static void Minus(double[] p, double s)

   {

       for (int i = 0; i < p.Length; i++)

           p[i] -= s;

   }

   public static Main(string[] args)

   {

       double[] pr; //массив с ценами

       double delta; //сумма

       string key = "Иванов"; //ключ

       pr = new double[] { 100.0, 200.0, 300.0 };

 

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

       if (args.Length != 3) return;

       //завершение программы - ошибка1

 

       //проверка фамилии

       if (args[2] != key) return;

       //завершение программы - ошибка2

 

       //пересчет цен

       delta = double.Parse(args[0]);

 

       //чтение операции

       switch (args[1].ToUpper())

       {

           case "ПЛЮС":

           case "+": Plus(pr, delta); break;

           case "МИНУС":

           case "-": Minus(pr, delta); break;

       }

 

       //вывод новых цен

  

       return;

   }

 

Перегруженные методы

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

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

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

1. Вызывающий метод – это тот метод, который совпадает с вызовом по имени, количеству и типу параметров.

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

3. Если такого метода нет, фиксируется ошибка.

 

Пример

Определить класс, описывающий понятие точка, методы, реализующие операции:

- Установка точки на числовой оси

- Установка точки на плоскости

- Установка точки в трехмерном пространстве

- Вычисление расстояния от точки до начала координат

 

 

class Точка

{

   private double x, y, h;

       

   //установка точки на прямой

   public void Set(double xp)

   {

       x = xp; y = 0; h = 0;

   }

 

     //установка точки на плоскости

   public void Set(double xp, double yp)

   {

       x = xp; y = yp; h = 0;

   }

      

   //установка точки в пространстве

   public void Set(double xp, double yp, double hp)

   {

          x = xp; y = yp; h = hp;

   }

 

   //вычисление расстояния

   public double Dist()

   {

       return Math.Sqrt(x * x + y * y + h * h);

   }

}

    

class Program

{

   public static void Main()

   {

       double d; //расстояние

       Точка тчк = new Точка();

           

       тчк.Set(2.0); //будет вызван первый Set()

       d=тчк.Dist(); // d=2.0

           

       тчк.Set(3.0,4.0); //будет вызван второй Set()

      d=тчк.Dist(); // d=5.0

 

       тчк.Set(2,3,6); //будет вызван третий Set

       d=тчк.Dist(); // d=7.0

   }

}

 

Перегруженные методы не различаются по типу возвращаемого значения.

 

Конструкторы

Представляют собой специфический метод класса. Специфика заключается:

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

в оформлении (т.е. в синтаксисе) – конструктор должен иметь имя, совпадающее с именем класса, конструктор не имеет возвращаемого значения.

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



Дата: 2019-02-02, просмотров: 277.