ВУЗ:
Составители:
Рубрика:
96
стороне, по двум сторонам и углу между ними и при многих других наборах
аргументов. Считается удобным во всех случаях иметь для метода одно имя,
например Square, и всегда, когда нужно вычислить площадь, не задумываясь,
вызывать метод Square, передавая ему известные в данный момент аргументы.
Перегрузка характерна и для знаков операций. В зависимости от типов
аргументов, один и тот же знак может выполнять фактически разные операции.
Классическим примером является знак операции сложения «+», который играет
роль операции сложения не только для арифметических данных разных типов,
но и выполняет конкатенацию строк.
Перегрузка требует уточнения семантики вызова метода. Когда
встречается вызов неперегруженного метода, то имя метода в вызове
однозначно определяет, тело какого метода должно выполняться в точке
вызова. Когда же метод перегружен, то знания имени недостаточно – оно не
уникально. Уникальной характеристикой перегруженных методов является их
сигнатура. Перегруженные методы, имея одинаковое имя, должны отличаться
либо числом аргументов, либо их типами, либо ключевыми словами (отметим:
с точки зрения сигнатуры, ключевые слова ref и out не отличаются).
Уникальность сигнатуры позволяет вызвать требуемый перегруженный метод.
Выше (стр. 86) уже были приведены четыре перегруженных метода с
именем A, различающиеся по сигнатуре. Эти методы отличаются типами
аргументов и ключевым словом params. Когда вызывается метод A с двумя
аргументами, то, в зависимости от типа, будет вызываться реализация без
ключевого слова params. Когда же число аргументов больше двух, то работает
реализация, позволяющая справиться с заранее не фиксированным числом
аргументов. При поиске подходящего перегруженного метода частные случаи
получают предпочтение в сравнении с общим случаем.
Насколько полезна перегрузка методов? Здесь нет экономии кода,
поскольку каждую реализацию нужно задавать явно; нет выигрыша по времени
– напротив, требуются определенные затраты на поиск подходящей
реализации, который может приводить к конфликтам, обнаруживаемым на
этапе компиляции. В нашем примере вполне разумно иметь четыре метода с
разными именами и осознанно вызывать метод, применимый к данным
аргументам. Существуют ситуации, где перегрузка полезна, недаром она
широко используется при построении библиотеки FCL. Например, класс
Convert, у которого 16 методов с разными именами, зависящими от целевого
типа преобразования. Каждый из этих 16 методов перегружен, и в свою
очередь, имеет 16 реализаций в зависимости от типа источника.
Приведём исходный код метода, тестирующего работу перегруженных
функций:
public void TestLoadMethods()
{
long u = 0;
double v = 0;
Страницы
- « первая
- ‹ предыдущая
- …
- 90
- 91
- 92
- 93
- 94
- …
- следующая ›
- последняя »
