การเขียนโปรแกรม D - การโอเวอร์โหลด
D ช่วยให้คุณระบุคำจำกัดความได้มากกว่าหนึ่งคำจำกัดความสำหรับไฟล์ function ชื่อหรือ operator ในขอบเขตเดียวกันซึ่งเรียกว่า function overloading และ operator overloading ตามลำดับ
การประกาศที่มากเกินไปคือการประกาศที่ได้รับการประกาศโดยใช้ชื่อเดียวกันกับการประกาศครั้งก่อนในขอบเขตเดียวกันยกเว้นว่าการประกาศทั้งสองจะมีข้อโต้แย้งที่แตกต่างกันและความหมายที่แตกต่างกันอย่างเห็นได้ชัด (การนำไปใช้งาน)
เมื่อคุณโทรเกิน function หรือ operatorคอมไพลเลอร์กำหนดนิยามที่เหมาะสมที่สุดที่จะใช้โดยการเปรียบเทียบประเภทอาร์กิวเมนต์ที่คุณใช้เรียกฟังก์ชันหรือตัวดำเนินการกับประเภทพารามิเตอร์ที่ระบุในนิยาม เรียกกระบวนการเลือกฟังก์ชันโอเวอร์โหลดที่เหมาะสมที่สุดหรือตัวดำเนินการoverload resolution..
ฟังก์ชันโอเวอร์โหลด
คุณสามารถกำหนดได้หลายคำจำกัดความสำหรับชื่อฟังก์ชันเดียวกันในขอบเขตเดียวกัน นิยามของฟังก์ชันจะต้องแตกต่างกันตามประเภทและ / หรือจำนวนอาร์กิวเมนต์ในรายการอาร์กิวเมนต์ คุณไม่สามารถโอเวอร์โหลดการประกาศฟังก์ชันที่แตกต่างกันตามประเภทการส่งคืนเท่านั้น
ตัวอย่าง
ตัวอย่างต่อไปนี้ใช้ฟังก์ชันเดียวกัน 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. ดังนั้นโปรแกรมเมอร์จึงสามารถใช้ตัวดำเนินการกับประเภทที่ผู้ใช้กำหนดได้เช่นกัน
ตัวดำเนินการสามารถโอเวอร์โหลดได้โดยใช้ string 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;
}
ตัวอย่างต่อไปนี้แสดงแนวคิดของตัวดำเนินการมากเกินไปโดยใช้ฟังก์ชันสมาชิก ที่นี่วัตถุจะถูกส่งผ่านเป็นอาร์กิวเมนต์ที่มีการเข้าถึงคุณสมบัติโดยใช้วัตถุนี้ วัตถุที่เรียกตัวดำเนินการนี้สามารถเข้าถึงได้โดยใช้this ตามคำอธิบายด้านล่าง -
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
ประเภทการโอเวอร์โหลดของตัวดำเนินการ
โดยทั่วไปมีตัวดำเนินการมากเกินไปสามประเภทตามรายการด้านล่าง
ซีเนียร์ | ประเภทการโอเวอร์โหลด |
---|---|
1 | Unary Operators โอเวอร์โหลด |
2 | ตัวดำเนินการไบนารีทำงานมากเกินไป |
3 | ตัวดำเนินการเปรียบเทียบโอเวอร์โหลด |