D позволяет вам указать более одного определения для имени функции или оператора в одной и той же области видимости, что называется перегрузкой функций и перегрузкой операторов соответственно.
Перегруженное объявление — это объявление, которое было объявлено с тем же именем, что и предыдущее объявление в той же области, за исключением того, что оба объявления имеют разные аргументы и, очевидно, разное определение (реализацию).
Когда вы вызываете перегруженную функцию или оператор , компилятор определяет наиболее подходящее определение для использования, сравнивая типы аргументов, которые вы использовали для вызова функции или оператора, с типами параметров, указанными в определениях. Процесс выбора наиболее подходящей перегруженной функции или оператора называется разрешением перегрузки. ,
Перегрузка функций
Вы можете иметь несколько определений для одного и того же имени функции в одной и той же области. Определение функции должно отличаться друг от друга типами и / или количеством аргументов в списке аргументов. Вы не можете перегружать объявления функций, которые отличаются только типом возвращаемого значения.
пример
В следующем примере одна и та же функция print () используется для печати разных типов данных.
import std.stdio; import std.string; class printData { public: void print(int i) { writeln("Printing int: ",i); } void print(double f) { writeln("Printing float: ",f ); } void print(string s) { writeln("Printing string: ",s); } }; void main() { printData pd = new printData(); // Call print to print integer pd.print(5); // Call print to print float pd.print(500.263); // Call print to print character pd.print("Hello D"); }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Printing int: 5 Printing float: 500.263 Printing string: Hello D
Перегрузка оператора
Вы можете переопределить или перегрузить большинство встроенных операторов, доступных в D. Таким образом, программист может также использовать операторы с пользовательскими типами.
Операторы могут быть перегружены с использованием строки op, за которой следует Add, Sub и т. Д., В зависимости от оператора, который перегружается. Мы можем перегрузить оператор +, чтобы добавить два поля, как показано ниже.
Box opAdd(Box b) { Box box = new Box(); box.length = this.length + b.length; box.breadth = this.breadth + b.breadth; box.height = this.height + b.height; return box; }
В следующем примере показана концепция перегрузки операторов с использованием функции-члена. Здесь объект передается в качестве аргумента, свойства которого доступны с использованием этого объекта. К объекту, который вызывает этот оператор, можно получить доступ, используя этот оператор, как объяснено ниже —
import std.stdio; class Box { public: double getVolume() { return length * breadth * height; } void setLength( double len ) { length = len; } void setBreadth( double bre ) { breadth = bre; } void setHeight( double hei ) { height = hei; } Box opAdd(Box b) { Box box = new Box(); box.length = this.length + b.length; box.breadth = this.breadth + b.breadth; box.height = this.height + b.height; return box; } private: double length; // Length of a box double breadth; // Breadth of a box double height; // Height of a box }; // Main function for the program void main( ) { Box box1 = new Box(); // Declare box1 of type Box Box box2 = new Box(); // Declare box2 of type Box Box box3 = new Box(); // Declare box3 of type Box double volume = 0.0; // Store the volume of a box here // box 1 specification box1.setLength(6.0); box1.setBreadth(7.0); box1.setHeight(5.0); // box 2 specification box2.setLength(12.0); box2.setBreadth(13.0); box2.setHeight(10.0); // volume of box 1 volume = box1.getVolume(); writeln("Volume of Box1 : ", volume); // volume of box 2 volume = box2.getVolume(); writeln("Volume of Box2 : ", volume); // Add two object as follows: box3 = box1 + box2; // volume of box 3 volume = box3.getVolume(); writeln("Volume of Box3 : ", volume); }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Volume of Box1 : 210 Volume of Box2 : 1560 Volume of Box3 : 5400
Типы перегрузки операторов
В основном, есть три типа перегрузки операторов, как указано ниже.