Переменное число параметров метода
Иногда число аргументов, которые будут переданы методу, неизвестно до периода выполнения. Например, вам нужен класс, который чертит на графике линию, заданную последовательностями х- и у-координат. Этот класс должен содержать методом, принимающим единственный аргумент — объект типа Point, представляющий значения обеих координат х и у. Этот метод должен сохранять каждый объект типа Point в связанном списке или в элементах массива, пока вызывающая программа не даст команду на вывод всей последовательности точек. Однако такое решение может быть не очень эффективным потому, что оно требует наличия в классе связанного списка. Но ведь можно было бы использовать единственный метод — DrawLine, которому этот список может и не потребоваться. Эту проблему эффективно решает метод с переменным количеством аргументов.
Такому методу можно задать переменное число аргументов через ключевое слово params в видемассива. Рассмотрим пример класса Chart, написанного на C#, позволяющего пользователю одним вызовом получить и вывести произвольное число объектов 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(Graphics g, params Point[] p)
{
Console.WriteLine("\пЭтот метод позволяет нарисовать линию " +
"по следующим точкам:");
for (int i = 0; i < p.GetLength(0); i++)
{ Console.WriteLine("{0), {1}". p[i].x, p[i].y); }
}
}
class ChartApp
{
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 Chart();
chart.DrawLine(p1, p2, p3);
}
}
Метод DrawLine сообщает компилятору C#, что он может принимать переменное число объектов типа Point. Затем в период выполнения метод использует простой цикл for для прохода по всем объектам Point и вывода всех точек.
Статическим называется метод, который существует в классе как в таковом, а не в отдельных его экземплярах. Как и в случае других статических членов, главное преимущество статических методов в том, что они расположены вне конкретных экземпляров класса, не засоряя глобальное пространство приложения. При этом они и не нарушают принципов ООП, поскольку ассоциированы с определенным классом.
Определить метод как статический позволяет ключевое слово static. Затем для вызова метода пользователь применяет синтаксис вида Класс. Метод. Этот синтаксис необходим, даже если у пользователя есть ссылка на экземпляр класса.
Статические (static) методы, или методы класса, можно вызывать, не создавая экземпляр объекта. Именно таким образом используется метод Main.
public class Sample
{
public static int a;
public int b;
public static void DoubleA(){ a *= 2; }
public void SetB(){ b = a; }
}
public class Application
{
public static void Main()
|
|
{
Sample sc1 = new Sample(), sc2 = new Sample();
Sample.a = 1;
sc1.SetB();
Sample.a = 2;
sc2.SetB();
Console.WriteLine("sc1.b = {0}, sc2.b = {1}", sc1.b, sc2.b);
}
}
Последним моментом, касающимся статических методов, является правило, определяющее, к каким членам класса можно обращаться из статического метода. Как вы можно догадаться, статический метод может обращаться к любому статическому члену в пределах класса, но не может обращаться к члену экземпляра.