शुरुआत में, पॉलीमॉर्फिज्म ग्रीक शब्दों Poly (जिसका अर्थ कई) और morphism (जिसका अर्थ रूप) से लिया गया है।
पॉलीमॉर्फिज्म ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में एक पैटर्न का वर्णन करता है जहां विभिन्न क्लासेज में समान काम करने वाले मेथड्स का समान नाम होना चाहिए। पॉलीमॉर्फिज्म अनिवार्य रूप से एक OOP पैटर्न है जो विभिन्न कार्यक्षमताओं वाली कई क्लासेज को एक कॉमन इंटरफेस को एक्ज़ीक्यूट या शेयर करने में सक्षम बनाता है। पॉलीमॉर्फिज्म की उपयोगिता यह है कि विभिन्न क्लासेज में लिखा गया कोड इस बात से कोई फर्क नहीं पड़ता कि यह किस क्लास से संबंधित है क्योंकि वे उसी तरह उपयोग किए जाते हैं। यह सुनिश्चित करने के लिए कि क्लासेज पॉलीमॉर्फिज्म दिशानिर्देश को इम्प्लीमेंट करती हैं, हम एब्स्ट्रैक्ट क्लासेज या इंटरफेस में से किसी एक विकल्प को चुन सकते हैं।
तो आइए इंटरफेस की मदद से पॉलीमॉर्फिज्म सिद्धांत को इम्प्लीमेंट करें।
इंटरफेस एक क्लास के समान है सिवाय इसके कि इसमें कोड नहीं हो सकता। एक इंटरफेस मेथड नाम और आर्गुमेंट्स को परिभाषित कर सकता है, लेकिन मेथड्स की सामग्री को नहीं। इंटरफेस इम्प्लीमेंट करने वाली किसी भी क्लास को इंटरफेस द्वारा परिभाषित सभी मेथड्स को एक्ज़ीक्यूट करना होगा।
उदाहरण:
<?php
interface Machine {
public function calcTask();
}
class Circle implements Machine {
private $radius;
public function __construct($radius){
$this -> radius = $radius;
}
public function calcTask(){
return $this -> radius * $this -> radius * pi();
}
}
class Rectangle implements Machine {
private $width;
private $height;
public function __construct($width, $height){
$this -> width = $width;
$this -> height = $height;
}
public function calcTask(){
return $this -> width * $this -> height;
}
}
$mycirc = new Circle(3);
$myrect = new Rectangle(3,4);
echo $mycirc->calcTask();
echo $myrect->calcTask();
?>
आउटपुट:
28.274 12
व्याख्या:
"Machine" नाम का इंटरफेस इसे इम्प्लीमेंट करने वाली सभी क्लासेज को calcTask() नाम के एक एब्स्ट्रैक्ट मेथड को परिभाषित करने के लिए प्रतिबद्ध करता है। तदनुसार, Circle क्लास इंटरफेस को इम्प्लीमेंट करती है और कॉलटास्क() मेथड को संबंधित बॉडी के साथ परिभाषित करती है। Rectangle क्लास भी Machine इंटरफेस को इम्प्लीमेंट करती है लेकिन calcTask() मेथड को एक अलग बॉडी के साथ परिभाषित करती है जो सर्कल क्लास के CalTask() मेथड से भिन्न होती है। पॉलीमॉर्फिज्म दिशानिर्देश कहते हैं कि इस स्थिति में, टास्क की गणना करने वाले सभी मेथड्स का समान नाम होगा। अब, जब भी हमें विभिन्न क्लासेज के लिए टास्क की गणना करने की आवश्यकता होगी, हम calcTask() नाम के मेथड को कॉल करेंगे बिना इस बात की अधिक परवाह किए कि वास्तव में विभिन्न मशीन के लिए टास्क की गणना कैसे करें। मुख्य बात जो हमें जानने की आवश्यकता होगी वह है टास्क की गणना करने वाले मेथड का नाम।