Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

1.6.6.5Перегрузка метода

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

class Test { static void F() { Console.WriteLine("F()"); }

static void F(object x) { Console.WriteLine("F(object)"); }

static void F(int x) { Console.WriteLine("F(int)"); }

static void F(double x) { Console.WriteLine("F(double)"); }

static void F<T>(T x) { Console.WriteLine("F<T>(T)"); }

static void F(double x, double y) { Console.WriteLine("F(double, double)"); }

static void Main() { F(); // Invokes F() F(1); // Invokes F(int) F(1.0); // Invokes F(double) F("abc"); // Invokes F(object) F((double)1); // Invokes F(double) F((object)1); // Invokes F(object) F<int>(1); // Invokes F<T>(T) F(1, 1); // Invokes F(double, double) } }

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

1.6.7Другие члены-функции

Члены класса, содержащие исполняемый код, в совокупности называются члены-функции. В предыдущем разделе описаны методы, представляющие собой простые члены-функции. В этом разделе описываются другие типы членов-функций, поддерживаемые в C#: конструкторы, свойства, индексаторы, события, операторы и деструкторы.

В следующей таблице описывается универсальный класс List<T>, который реализует расширяемый список объектов. Класс содержит несколько примеров наиболее распространенных типов членов-функций.

public class List<T> {

const int defaultCapacity = 4;

Константа

T[] items; int count;

Поля

public List(int capacity = defaultCapacity) { items = new T[capacity]; }

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

public int Count { get { return count; } }

public int Capacity { get { return items.Length; } set { if (value < count) value = count; if (value != items.Length) { T[] newItems = new T[value]; Array.Copy(items, 0, newItems, 0, count); items = newItems; } } }

Свойства

public T this[int index] { get { return items[index]; } set { items[index] = value; OnChanged(); } }

Индексатор

public void Add(T item) { if (count == Capacity) Capacity = count * 2; items[count] = item; count++; OnChanged(); }

protected virtual void OnChanged() { if (Changed != null) Changed(this, EventArgs.Empty); }

public override bool Equals(object other) { return Equals(this, other as List<T>); }

static bool Equals(List<T> a, List<T> b) { if (a == null) return b == null; if (b == null || a.count != b.count) return false; for (int i = 0; i < a.count; i++) { if (!object.Equals(a.items[i], b.items[i])) { return false; } } return true; }

Методы

public event EventHandler Changed;

Событие

public static bool operator ==(List<T> a, List<T> b) { return Equals(a, b); }

public static bool operator !=(List<T> a, List<T> b) { return !Equals(a, b); }

Операторы

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]