การเขียนโปรแกรม 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 ตัวดำเนินการเปรียบเทียบโอเวอร์โหลด