всех трех функций, хотя они реализованы по одному и тому же основному принципу. Подобные затруднения в C# не возникают, поскольку каждому методу, определяющему абсолютное значение, может быть присвоено одно и то же имя. И действительно, в состав библиотеки классов для среды .NET Framework входит метод Abs (), который перегружается в классе System. Math для обработки данных разных числовых типов. Компилятор C# сам определяет, какой именно вариант метода Abs () следует вызывать, исходя из типа передаваемого аргумента.
Главная ценность перегрузки заключается в том, что она обеспечивает доступ к связанным вместе методам по общему имени. Следовательно, имя Abs обозначает общее выполняемое действие, а компилятор сам выбирает конкретный вариант метода по обстоятельствам. Благодаря полиморфизму несколько имен сводятся к одному. Несмотря на всю простоту рассматриваемого здесь примера, продемонстрированный в нем принцип полиморфизма можно расширить, чтобы выяснить, каким образом перегрузка помогает справляться с намного более сложными ситуациями в программировании.
Когда метод перегружается, каждый его вариант может выполнять какое угодно действие. Для установления взаимосвязи между перегружаемыми методами не существует какого-то одного правила, но с точки зрения правильного стиля программирования перегрузка методов подразумевает подобную взаимосвязь. Следовательно, использовать одно и то же имя для несвязанных друг с другом методов не следует, хотя это и возможно. Например, имя Sqr можно было бы выбрать для методов, возвращающих квадрат и квадратный корень числа с плавающей точкой. Но ведь это
принципиально разные операции. Такое применение перегрузки методов противоречит ее первоначальному назначению. На практике перегружать следует только тесно связанные операции.
В C# определено понятие
Перегрузка конструкторов
Как и методы, конструкторы также могут перегружаться. Это дает возможность конструировать объекты самыми разными способами. В качестве примера рассмотрим следующую программу.
// Продемонстрировать перегрузку конструктора.
using System;
class MyClass { public int x;
public MyClass() {
Console.WriteLine('В конструкторе MyClass().'); x = 0;
}
public MyClass(int i) {
Console.WriteLine('В конструкторе MyClass(int).'); x = i ;
}
public MyClass(double d) {
Console.WriteLine('В конструкторе MyClass(double).'); x = (int) d;
}
public MyClass(int i, int j) {
Console.WriteLine('В конструкторе MyClass(int, int).'); x = i * j;
}
}
class OverloadConsDemo { static void MainO- {
MyClass tl = new MyClass ();
MyClass t2 = new MyClass(88);
MyClass t3 = new MyClass(17.23);
MyClass t4 = new MyClass(2, 4);
Console.WriteLine('tl.x: ' + tl.x);
Console.WriteLine('t2.х: ' + t2.x);
Console.WriteLine('t3.x: ' + t3.x);
Console.WriteLine('t4.x: ' + t4.x);
}
}
При выполнении этой программы получается следующий результат.
В конструкторе MyClass().
В конструкторе MyClass (int) .
