Programowanie D - Przeciążenie
D pozwala określić więcej niż jedną definicję pliku function imię lub nazwisko operator w tym samym zakresie, który jest nazywany function overloading i operator overloading odpowiednio.
Deklaracja przeciążona to deklaracja, która została zadeklarowana z taką samą nazwą jak poprzednia deklaracja w tym samym zakresie, z tym wyjątkiem, że obie deklaracje mają różne argumenty i oczywiście inną definicję (implementację).
Kiedy dzwonisz do przeciążonego pliku function lub operator, kompilator określa najbardziej odpowiednią definicję do użycia, porównując typy argumentów użyte do wywołania funkcji lub operatora z typami parametrów określonymi w definicjach. Wywoływany jest proces wyboru najbardziej odpowiedniej przeciążonej funkcji lub operatoraoverload resolution..
Przeciążanie funkcji
Możesz mieć wiele definicji dla tej samej nazwy funkcji w tym samym zakresie. Definicja funkcji musi różnić się od siebie typami i / lub liczbą argumentów na liście argumentów. Nie można przeciążać deklaracji funkcji, które różnią się tylko zwracanym typem.
Przykład
Poniższy przykład używa tej samej funkcji print() wydrukować różne typy danych -
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");
}
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
Printing int: 5
Printing float: 500.263
Printing string: Hello D
Przeciążanie operatorów
Możesz przedefiniować lub przeciążać większość wbudowanych operatorów dostępnych w D. W ten sposób programista może również używać operatorów z typami zdefiniowanymi przez użytkownika.
Operatory mogą być przeciążane za pomocą string op, po którym następuje Add, Sub i tak dalej na podstawie operatora, który jest przeciążany. Możemy przeciążać operatora +, aby dodać dwa pola, jak pokazano poniżej.
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;
}
Poniższy przykład przedstawia koncepcję przeciążania operatora przy użyciu funkcji składowej. W tym przypadku obiekt jest przekazywany jako argument, którego właściwości są dostępne za pomocą tego obiektu. Dostęp do obiektu, który wywołuje tego operatora, można uzyskać za pomocąthis operator, jak wyjaśniono poniżej -
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);
}
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
Volume of Box1 : 210
Volume of Box2 : 1560
Volume of Box3 : 5400
Typy przeciążania operatorów
Zasadniczo istnieją trzy typy przeciążania operatorów, wymienione poniżej.
Sr.No. | Typy przeciążenia |
---|---|
1 | Przeciążanie operatorów jednoargumentowych |
2 | Przeciążanie operatorów binarnych |
3 | Przeciążanie operatorów porównania |