Принципы объектно-ориентированного программирования

         

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



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

Иногда число аргументов, которые будут переданы методу, неизвестно до периода выполнения. Например, вам нужен класс, который чертит на графике линию, заданную последовательностями х- и у-координат. У вас может быть класс с методом, принимающим единственный аргумент — объект 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 — в главе И.

 

Содержание раздела