Поиск

Переменное число параметров метода

Иногда число аргументов, которые будут переданы методу, неизвестно до периода выполнения. Например, вам нужен класс, который чертит на графике линию, заданную последовательностями х- и у-координат. У вас может быть класс с методом, принимающим единственный аргумент — объект Point, который представляет значения обеих координат х и у. Затем этот метод сохраняет каждый объект Point в связанном списке или в элементах массива, пока вызывающая программа не даст команду на вывод всей последовательности точек. Однако это решение не годится по двум причинам. Во-первых, оно требует от пользователя рутинной работы по вызову одного и того же метода для каждой точки линии, которую нужно нарисовать, — очень утомительно, если линия будет длиной; а чтобы нарисовать линию, затем приходится вызывать другой метод. Во-вторых, данное решение требует от класса хранить эти точки, тогда как они нужны лишь для того, чтобы использовать единственный метод — DrawLine. Эту проблему эффективно решает переменное количество аргументов.

Вы можете задавать переменное число параметров метода через ключевое слово params и указывая массив в списке аргументов метода. Вот пример класса Draw, написанного на С#, позволяющего пользователю одним вызовом получить и вывести произвольное число объектов Point:

using System;
class Point {
public Point(int x, int y) {
this.x = x; this.у = у; }
public int x; public int y; }
class Chart {
public void DrawLine(params Point[] p) {
Console.WriteLine("пЭтот метод позволяет нарисовать
 линию " + "по следующий точкам:"); for (int i = 0; i < p.GetLength(O); i++) {
Console.WriteLine("{0), {1}". p[i].x, p[i].y); } } }
class VarArgsApp {
public static void Main() {
Point p1 = new Point(5,10); Point p2 = new Point(5, 15);
Point p3 = new Point(5, 20);
Chart chart = new ChartQ;
chart.DrawLine(p1, p2, p3); } }

Метод DrawLine сообщает компилятору С#, что он может принимать переменное число объектов Point. Затем в период выполнения метод ис- пользует простой цикл for для прохода по всем объектам Point и вывода всех точек.

В реальном приложении для доступа к членам х и у объекта Point на-, много лучше будет использовать свойства, чем объявлять эти члены как public. Кроме того, в методе DrawLine было бы лучше применять оператop foreach вместо цикла for. Но чтобы не нарушать ход изложения ма-т.ериала, я пока не буду вводить эти функции языка. О свойствах я расскажу в главе 7, а об операторе foreach — в главе И.