பல்லுருத்தோற்றம் (கணிப்பொறி அறிவியல்): திருத்தங்களுக்கு இடையிலான வேறுபாடு

கட்டற்ற கலைக்களஞ்சியமான விக்கிப்பீடியாவில் இருந்து.
உள்ளடக்கம் நீக்கப்பட்டது உள்ளடக்கம் சேர்க்கப்பட்டது
சி r2.5.1) (தானியங்கிமாற்றல்: en:Polymorphism (computer science)
Natkeeran (பேச்சு | பங்களிப்புகள்)
"பொருள் நோக்கு நிரலாக்கத்..."-இப்பெயரில் புதிய பக்கம் உருவாக்கப்பட்டுள்ளது
வரிசை 1: வரிசை 1:
பொருள் நோக்கு நிரலாக்கத்தில், பல்லுருத்தோற்றம் (Polymorphism) என்பது ஒரு வகுப்பின் செயலிகளை, மாறிகளை, அல்லது பொருட்களை அந்த வகுப்பின் subclasses தமது தேவைகளுக்கு ஏற்றமாதிரி நிறைவேற்ற முடியும் என்ற கூற்றாகும்.
{{underconstruction}}
{{கூகுள் தமிழாக்கக் கட்டுரை}}


== எடுத்துக்காட்டுக்கள் ==
=== பி.எச்.பி ===
===PHP===


<source lang=php>
கணிப்பொறி அறிவியலில், '''பாலிமார்ஃபிஸம்''' என்பது ஒரேவிதமான இடைமுகங்களைப் பயன்படுத்தி கையாளுவதற்கான வெவ்வேறு டேட்டா வகைகளின் மதிப்புக்களை அனுமதிக்கின்ற [[நிரலாக்க மொழி]] அம்சமாகும். பாராமெட்ரிக் பாலிமர்பிஸம் என்றக் கருத்தாக்கம் டேட்டா வகை மற்றும் செயல்பாடுகள் ஆகிய இரண்டிற்கும் பொருந்துவதாக இருக்கிறது. வெவ்வேறு வகைகளை மதிப்பிடுதல் அல்லது மதிப்புக்களைப் பயன்படுத்தும் ஒரு செயல்பாடே ''பாலிமார்பிக் செயல்பாடு'' எனப்படுகிறது. பொதுமைப்படுத்தப்பட்ட வகையாக தோன்றக்கூடிய டேட்டா டைப் (உதாரணம்., கட்டுப்பாடற்ற வகையின் கூறுகளைக் கொண்ட [[பட்டியல்]]) என்பது இதுபோன்ற சிறப்பு வகைகள் உருவாக்கப்படுகின்ற பொதுமைப்படுத்தப்பட்ட வகை போன்று ''பாலிமார்பிக் டேட்டா டைப்பாக'' வடிவமைக்கப்பட்டுள்ளன.
<?php


interface IAnimal
{
function getName();
function talk();
}


abstract class AnimalBase implements IAnimal
அடிப்படையிலேயே வேறுபட்ட இரண்டுவகையான பாலிமர்பிஸம்கள் உள்ளன, இது உண்மையில் 1967 இல் கிறிஸ்டோபர் ஸ்ட்ராச்சியால் அதிகாரப்பூர்மவற்ற முறையில் விளக்கப்பட்டுள்ளது. ஒரு செயல்பாடு தனிப்பட்ட முறையில் குறிப்பிடப்பட்ட வகைகள் மற்றும் கலவைகளைப் பொறுத்து வெவ்வேறான மற்றும் மாறுபட்ட வகையைக் கொண்ட அமலாக்கங்களைக் குறிப்பிட்டால் அது '''அட்-ஹாக் பாலிமார்பிஸம்''' எனப்படுகிறது. ஃபங்ஷன் மற்றும் மெத்தேட் ஓவர்லோடிங் ஆகியவற்றைப் பயன்படுத்தும் பல மொழிகளிலும் அட்-ஹாக் பாலிமார்பிஸம் ஏற்கப்படுகிறது.
{
protected $name;


public function __construct($name)
{
$this->name = $name;
}


public function getName()
எல்லாக் குறியாக்கமும் எந்தவொரு குறிப்பிட்ட வகையையும் குறிப்பிடாமல், எந்த ஒரு புதிய வகையிலுமான எண்ணோடும் வெளிப்படையாகப் பயன்படுத்தப்பட்டது என்றால் இது '''பாராமெட்ரிக் பாலிமார்பிஸம்''' எனப்படுகிறது. ஜான் சி.ரெனால்ட்ஸ் (மற்றும் மறைந்த ஜேன்-யேவ்ஸ் கிரார்ட்) முன்னதாக லம்டா கால்குலஸிற்கு (பாலிமார்பிக் லம்டா கால்குலஸ் அல்லது சி்ஸ்டம் எஃப் எனப்படுவது) நீட்சியாக பாலிமார்பிஸம் என்றக் கருத்தாக்கத்தை உருவாக்கினார். பாராமெட்ரிக் பாலிமார்பிஸம் என்பது புள்ளிவிவரரீதியில் டைப் செய்யப்பட்ட செயல்பாட்டு நிரலாக்க மொழிகளில் பயன்படுத்தப்படுகிறது. ஆப்ஜெக்ட்-சார்ந்த நிரலாக்க சமூகத்தில் பாராமெட்ரிக் பாலிமார்பிஸத்தைப் பயன்படுத்தும் நிரலாக்கம் ''ஜெனரிக் புரோகிராமிங்'' என்று அழைக்கப்படுகிறது.
{
return $this->name;
}
}


class Cat extends AnimalBase
{


public function talk()
ஆப்ஜெக்ட்-சார்ந்த நிரலாக்கத்தில், '''இன்க்லூஸன் பாலிமார்பிஸம்''' என்பது, சில சூப்பர் கிளாஸால் தொடர்புபடுத்தப்படும்வரையிலான பல வேறுபட்ட கிளாஸ்களின் நிகழ்வுகளைக் குறிக்கக்கூடிய பெயராக இருக்கக்கூடியவிடத்தில் டைப் கோட்பாட்டில் உள்ள கருத்தாக்கமாகும்.<ref name="gbooch">பூக், மற்றும் சிலர் 2007 ''ஆப்ஜெக்ட்-ஓரியண்டட் அனாலிஸில் அண்ட் சிம்பிள் டிசைன் வித் அப்ளிகேஷன்.'' அடிஸன் -வெஸ்லெ . </ref> இன்க்லூஸன் பாலிமார்பிஸம் என்பது பொதுவாக சப்டைப்பிங் வழியாக உதவியளிக்கப்படுவதாகும், எ.கா., வெவ்வேறு டைப்களின் ஆப்ஜெக்ட்கள் மற்றொரு டைப்பின் ஆப்ஜெட்டிற்கு முற்றிலும் மாற்றியளிக்கக்கூடியவை (அவற்றின் அடிப்படை டைப்கள்) என்பதோடு இவ்வாறு பொதுவான இடைமுகத்தின் வழியாக கையாளப்படக்கூடியவை. இதற்கு மாற்றாக, இன்க்லூஸன் பாலிமார்பிஸமானது, டைப் கேஸ்டிங் என்றும் அறியப்படுகின்ற டைப் கோயர்ஸன் வழியாக அடையப்படக்கூடியவையாக இருக்கலாம்.
{
return "Meowww!";
}
}


class Dog extends AnimalBase
== வலுவாக டைப் செய்யப்பட்ட மொழிகளில் (முந்தைய-வரையறை) ==
{


public function talk()
=== பாராமெட்ரிக் பாலிமார்பிஸம் ===
{
return "Arf! Arf!";
}
}


$animals = array(
new Cat("Missy"),
new Cat("Mr. Mistoffelees"),
new Dog("Lassie")
);


foreach ($animals as $animal) {
பாராமெட்ரிக் பாலிமார்பிஸம் என்பது மொழியை மிக அதிகமாக வெளிப்படுத்தக்கூடிய வகையிலான முறையாகும், அதேசமயத்தில் இது முற்றிலுமான அசைவற்ற டைப் பாதுகாப்பையும் தக்கவைக்கிறது. '''பாரமெட்ரிக் பாலிமார்பிஸத்தைப்''' பயன்படுத்தி, ஒரு செயல்பாடு அல்லது டேட்டா டைப்பை ஜெனரிக்காக எழுதலாம் என்பதால் அவற்றின் வகையைச் சாராமல் மதிப்புக்களை இது ''அடையாளப்பூர்வமாக'' கையளாமுடியும்<ref name="bjpierce">பியர்ஸ், பி. சி. 2002 ''டைப்ஸ் அண்ட் புரோகிராமிங் லாங்குவேஜஸ்.'' எம்ஐடி பிரஸ்</ref>. இதுபோன்ற செயல்பாடுகளும் டேட்டா வகைகளும் முறையே '''ஜெனரிக் ஃபங்ஷன்''' மற்றும் '''ஜெனரிக் டேட்டாடைப்ஸ்''' என்று அழைக்கப்படுகின்றன.
echo $animal->getName() . ": " . $animal->talk();
}


?>
</source>


== பெர்ள் ==
உதாரணத்திற்கு, இரண்டு பட்டியல்களில் சேர்கின்ற <code>append</code>ஐ கட்டமைக்க முடியும் என்பதால் இது அடிப்படை அம்சத்தைப் பற்றி அக்கறைகொள்ளாது: இது இண்டீஜர்களின் பட்டியல், இயல்பெண்களின் பட்டியல்கள், ஸ்ட்ரிங்ஸ்களின் பட்டியல் ஆகியவற்றை இணைத்துக்கொள்ளும். ''டைப் வேரியபிள் '''a''' '' இந்தப் பட்டியலிலுள்ள ஆக்கக்கூறுகளின் வகையைக் குறிக்கட்டும். பிறகு<code> append</code> என்பதை [''a'' ] என்பது டைப் ''a'' இன் கூறுகள் பட்டியலைக் குறிக்கும் இடத்தில் [''a'' ] × [''a'' ] → [''a'' ] என்று டைப் செய்யலாம். <code>append</code> இன் டைப் ''a'' இன் எல்லா மதிப்புக்களுக்குமான '''a''' இன் மூலம் தனி வரையறைப்படுத்தப்படுகிறது என்று நாம் கூறலாம். (ஒரே ஒரு டைப் வேரியபிள்தான் இருக்கிறது என்பதால், இந்தச் செயல்பாடு எந்த ஒரு பட்டியல் இணைக்கும் பயன்படுத்தப்பட இயலாது என்பதை கவனிக்கவும்: இந்தப் பட்டியலின் காரணமாக ஏற்பட்ட இந்த இணையானது ஒரேவிதமான டைப் கூறுகளைப் பெற்றிருக்க வேண்டும்.) <code>append</code> பயன்படுத்தப்படும் ஒவ்வொரு இடத்திற்கும் மதிப்பானது ''a'' என்று தீர்மானிக்கப்படுகிறது.
===Perl===
Polymorphism in [[Perl]] is inherently straightforward to write because of the language's use of [[Sigil (computer programming)|sigils]] and [[Reference (computer science)|references]]. This is the <code>Animal</code> example in standard OO Perl:


<source lang=perl>
package Animal;
sub new {
my ($class, $name) = @_;
bless {name => $name}, $class;
}


package Cat;
பாராமெட்ரிக் பாலிமார்பிஸம் 1976 இல் எம்எல்லில் நிரலாக்க மொழிக்கு முதன்முதலாக அறிமுகப்படுத்தப்பட்டது. இன்று இது Standard ML, OCaml, Ada, Haskell, Visual Prolog மற்றும் பிறவற்றில் இருந்துவருகிறது. Java, C#, Visual Basic .NET மற்றும் Delphi (CodeGear) ஆகிய ஒவ்வொன்றிற்கும் பாராமெட்ரிக் பாலிமார்பிஸத்திற்கான "ஜெனரிக்குகள்" சமீபத்தில் அறிமுகப்படுத்தப்பட்டுள்ளன. பாலிமார்பிஸத்தின் சில அமலாக்கங்கள் அட்-ஹாக் நோக்கங்களை அறிமுகப்படுத்துகிற அதேநேரத்தில் பாராமெட்ரிக் பாலிமார்பிஸத்தோடு மிகவும் ஒத்ததாக இருக்கிறது. C++ டெம்ப்லட் நிபுணத்துவம் ஒரு உதாரணமாகும்.
@ISA = "Animal";
sub talk {"Meow"}
பாலிமார்பிஸத்தின் மிகவும் பொதுவான வடிவம் "ஹையர்-ரேங்க் இம்ப்ரிடிகேடிவ் பாலிமார்பிஸம்" ஆகும். தடுக்கப்பட்ட ரேங்க் பாலிமார்பிஸம் (உதாரணத்திற்கு ரேங்க்-1 அல்லது ''பிரினெக்ஸ்'' பாலிமார்பிஸம்) மற்றும் பிரிடிகேடிவ் பாலிமார்பிஸம் ஆகியவை இந்த வடிவத்தின் பிரபலமான இரண்டு தடைகள் ஆகும். அத்துடன், இந்தத் தடைகள் எம்எல் மற்றும் முந்தைய ஹேஸ்கல் வடிவங்களில் காணப்படும் பாலிமார்பிஸத்தின் அத்தியாவசிய வகையாக உள்ள "பிரிடிகேட்டிவ் பிரினெக்ஸ் பாலிமார்பிஸத்தை" வழங்குகின்றன.


package Dog;
@ISA = "Animal";
sub talk {"Woof! Woof!"}


package main;
my @animals = (
Cat->new("Missy"),
Cat->new("Mr. Mistoffelees"),
Dog->new("Lassie"),
);
for my $animal (@animals) {
print $animal->{name} . ": " . $animal->talk . "\n";
}


# prints the following:
==== ரேங்க் தடைகள் ====
#
# Missy: Meow
# Mr. Mistoffelees: Meow
# Lassie: Woof! Woof!
</source>


This means that Perl can also apply polymorphism to the method call. The example below is written using the <code>Moose</code> module in order to show modern OO practises in Perl (it is not required for method polymorphism):
===== ரேங்க்-1 (பிரினெக்ஸ்) பாலிமார்பிஸம் =====


<source lang=perl>
{
package Animal;
use Moose;
has 'name' => ( isa => 'Str', is => 'ro' );
}


{
''பிரினெக்ஸ் பாலிமார்பிக்'' அமைப்பில், டைப் வேரியபிள்கள் பாலிமார்பிக் டைப்கள் கொண்டு ஆதாரத்துடன் நிரூபிக்கப்படாமல் போகலாம். இது "எம்எல்-ஸ்டைல்" அல்லது "லெட்-பாலிமார்பிஸம்" என்று அழைக்கப்படுவதோடு மிகுந்த ஒற்றுமையுடையதாக இருக்கிறது (தொழில்நுட்பரீதியில் எம்எல்லின் லெட்-பாலிமார்பிஸம் வேறு சில அமைப்பு விதி தடைகளைக் கொண்டிருக்கலாம்).
package Cat;
use Moose;
extends 'Animal';
sub talk { 'Meow' }
sub likes { 'Milk' }
}


{
package Dog;
use Moose;
extends 'Animal';
sub talk { 'Woof! Woof!' }
sub likes { 'Bone' }
}


my @animals = (
இந்தத் தடை பாலிமார்பிக் டைப் மற்றும் பாலிமார்பிக் டைப் அல்லாதவற்றின் வித்தியாசத்தை மிகுந்த முக்கியத்துவம் வாய்ந்ததாக்குகிறது; இவ்வாறு பிரிடிகேடிவ் சிஸ்டம்ஸ் பாலிமார்பிக் வகைகள் சிலநேரங்களில் ''மோனோடைப்ஸ்'' எனப்படும் வழக்கமான (மோனோமார்பிக்) டைப்களிலிருந்து வேறுபடுத்திக்காட்ட ''டைப் ஷிமாஸ்களாக'' அவ்வப்போது குறிப்பிடப்படுகின்றன. மிகவும் வெளிப்புறமான (பிரினெக்ஸ்) நிலையில் எல்லா குவாண்டிஃபயர்களையும் அமைக்கின்ற வடிவத்தில் எல்லா டைப்களையும் எழுத முடியும் என்பதே தொடர்விளைவாகும்.
Cat->new( name => 'Missy' ),
Cat->new( name => 'Mr. Mistoffelees' ),
Dog->new( name => 'Lassie' ),
);


for my $animal ( @animals ) {
for my $trait qw/talk likes/ {
print $animal->name . ': ' . $trait . ' => ' . $animal->$trait;
}
}


# prints the following:
உதாரணத்திற்கு, டைப் [''a'' ] × [''a'' ] → [''a'' ] என்று மேலே விவரிக்கப்பட்டுள்ள <code>append</code> செயல்பாட்டை பரிசீலனைக்கு எடுத்துக்கொள்வோம்; இந்த செயல்பாட்டை ஒரு பட்டியல் இணைக்குப் பயன்படுத்துவதற்கு, ஒரு டைப்பானது இந்த வகை செயல்பாட்டில் வேரியபிள் ''a'' க்கு மாற்றியளிக்கப்பட வேண்டும், இதுபோன்ற ஆர்கியூமெண்ட்ஸ் முடிவாக கிடைக்கும் டைப்போடு பொருந்திப்போகின்றன. ஒரு ''இம்பிரிகேடிவ்'' சிஸ்டத்தில், பதிலீடு செய்யப்படும் இந்த டைப் வேறு எந்த டைப்பாகவும் இருக்கலாம், பாலிமார்பிக்காகவே இருக்கும் டைப் உட்பட; இவ்வாறு <code>append</code> எந்த ஒரு டைப்பாகவும் இருக்கும் பட்டியல்களின் இணைக்கு பயன்படுத்தப்படலாம்-<code>append</code> போன்ற பாலிமார்பி்க் செயல்பாடுகளுக்கும்கூட.
#
# Missy: talk => Meow
# Missy: likes => Milk
# Mr. Mistoffelees: talk => Meow
# Mr. Mistoffelees: likes => Milk
# Lassie: talk => Woof! Woof!
# Lassie: likes => Bone
</source>




== வெளி இணைப்புகள் ==
மொழி எம்எல் மற்றும் அதனுடைய நெருங்கிய தொடர்புகளில் உள்ள பாலிமார்பிஸம் பிரிடிகேடிவ்தான். மற்ற தடைகளுடன் சேர்ந்து இது பிரிடிகேடிவ்வாக இருப்பதன் காரணமாக டைப் சிஸ்டத்தை, டைப் அனுமானம் சாத்தியமாக்குவதற்கு இந்த டைப் சிஸ்டத்தை போதுமானதாக்குகிறது. மொழிகளில் வெளிப்படையான மறைகுறியீடுகள் பாலிமார்பிக் செயல்பாட்டைப் பயன்படுத்தும்போது எப்போது அவசியமாகப்படுகிறதோ, அப்போது பிரிடிகேட்டிவிட்டி தடை குறைந்த முக்கியத்துவம் வாந்ததாகிறது; ஆகவே இந்த மொழிகள் பொதுவாக இம்பிரிடிகேடிவ்வாக உள்ளன. ஹேஸ்கல் பிரிடிகேட்டிவிட்டி இல்லாமலேயே டைப் அனுமானத்தைக் கையாளுகிறது ஆனால் சில சிக்கல்கள் இருக்கின்றன.
* [http://www.devshed.com/c/a/PHP/PHP-5-and-Polymorphism/ PHP 5 and Polymorphism]


[[பகுப்பு:பொருள் நோக்கு நிரலாக்கம்]]


[[en:Polymorphism in object-oriented programming]]

===== ரேங்க்-''k'' பாலிமார்பிஸம் =====


சில நிச்சயிக்கப்பெற்ற மதிப்பு ''k'' விற்கு, ரேங்க்-''k'' பாலிமார்பிஸம் என்பது ''k'' அம்புக்குறிகளுக்கும் அதிகமாக ஒரு குவான்டிஃபயர் தோன்றவியலாத அமைப்பாகும் (டைப் ஒரு மரமாக வரையப்படும்போது)<ref name="bjpierce"/>.


ரேங்க்-2க்கான பாலிமார்பிஸத்திற்கான டைப் மறுகட்டுமானம் தீர்மானிக்கப்படக்கூடியது, ஆனால் ரேங்க்-3க்கான மறுகட்டுமானமும் அதற்கு மேற்பட்டவையும் இல்லை.



===== ரேங்க்-''n'' ("ஹையர்-ரேங்க்") பாலிமார்பிஸம் =====


ரேங்க்-''n'' பாலிமார்பிஸம் என்பது குவாண்டிஃபயர்கள் பல அம்புக்குறிகள் இருக்கும் இடதுபக்கத்திற்குத் தோன்றக்கூடிய பாலிமார்பிஸமாகும்.



==== பிரிடிகேடிவிட்டி தடைகள் ====

===== பிரிடிகேடிவ் பாலிமார்பிஸம் =====


பிரிடிகேடிவ் பாராமெட்ரிக் பாலிமார்பிக் அமைப்பில், டைப் வேரியபிளைக்<math>\alpha</math> கொண்டிருக்கும் ஒரு டைப்<math>\tau</math>, பாலிமார்பிக் டைப்பிற்கு<math>\alpha</math> நிரூபிக்கப்படக்கூடிய முறையில் பயன்படுத்தப்படாமல் போகலாம்.



===== இம்பிரிடிகேடிவ் பாலிமார்பிஸம் ("முதல் வகுப்பு" பாலிமார்பிஸம்) =====


முதல்-வகுப்பு பாலிமார்பிஸம் என்றும் அழைக்கப்படுவது. இம்பிரிடிகேடிவ் பாலிமார்பிஸம் ஒரு வேரியபிளின் நிரூபணத்தை எந்த ஒரு டைப் உடனும் உள்ள <math>\tau</math> டைப்புடனும் அனுமதிக்கிறது, <math>\tau</math> போன்ற பாலிமார்பிக் டைப்கள் உட்பட.


டைப் கோட்பாட்டில், மிகவும் தொடர்ச்சியாக ஆய்வுசெய்யப்பட்ட இம்பிரிடிகேடிவ் டைப்டு λ-கால்குலி அவற்றின் லம்டா க்யூப் அடிப்படையில், குறிப்பாக சிஸ்டம் எஃப் அடிப்படையில் அமைந்துள்ளன. மார்டின்-லோஃப் டைப் கோட்பாடு மற்றும் NuPRL ஆகியவை பிரிகேடிகேடிவ் கோட்பாடுகளாகும்.



==== பிணைப்பு பாராமெட்ரிக் பாலிமார்பிஸம் ====


1985 இல் கார்டெல்லி மற்றும் வேக்னர் ஆகியோர் டைப் பாரமீட்டர்களில் ''பிணைப்புக்களை'' அனுமதிப்பதன் அனுகூலங்களை அங்கீகரித்தனர். பல செயல்முறைகளுக்கும் டேட்டா டைப் பற்றி சிறிதளவு தெரிந்திருக்க வேண்டியிருக்கிறது, ஆனால் மற்றவகையில் பாராமெட்ரிக்காக செயல்பட முடியும். உதாரணத்திற்கு, பட்டியலில் ஒரு அம்சம் உள்ளிடப்பட்டிருக்கிறதா என்பதைப் பார்ப்பதற்கு நாம் அந்த அம்சங்களை சமன்பாட்டிற்காக ஒப்பிட்டுப் பார்க்க வேண்டும். ஸ்டாண்டர்டு எம்எல் இல், வடிவம் ''’’a'' இன் டைப் பாராமீட்டர்கள் தடைசெய்யப்படுகின்றன, இதனால் ''’’a'' × ''’’a'' list → bool and ''’’a'' என்ற டைப் கொண்டிருக்கும் இந்தச் செயல்பாடு வரையறு சமன்களுடனான டைப் உடன் மட்டுமே இருக்க முடியும். ஹேஸ்கலில் பிணைப்பு டைப் கிளாஸிடம் இருக்க வேண்டிய டைப்களால் மட்டுமே எட்டப்படுவதாகிறது; இவ்வாறு இதே செயல்பாடு ஹேஸ்கலில் <math>{\scriptstyle Eq \, \alpha \, \Rightarrow \alpha \, \rightarrow \left[\alpha \right] \rightarrow Bool}</math> டைப்பைப் பெறுகிறது. பாராமெட்ரிக் பாலிமார்பிஸத்தை ஏற்கின்ற மிகவும் ஆப்ஜெக்ட் சார்ந்த நிரலாக்க மொழியில் கொடுக்கப்பட்ட டைப்பின் சப்டைப்பாக கட்டுப்படுத்தப்படுகிறது (கீழே பார்க்க [[#சப்டைப்பிங் பாலிமார்பிஸம்]] மற்றும் ஜெனரிக் புரோகிராமிங் கட்டுரை).



=== சப்டைப்பிங் பாலிமார்பிஸம் (அல்லது இன்க்லூஸன் பாலிமார்பிஸம்) ===
{{main|Subtype}}
சில மொழிகள் பாராமெட்ரிக் பாலிமார்பிஸத்தின் குறிப்பிட்ட நிகழ்வில் பயன்படுத்தப்படக்கூடிய வகைகளின் அளவுகளைத் தடுப்பதற்கு ''சப்டைப்கள்'' என்ற கருத்தாக்கத்தை நிறுவியுள்ளன. இந்த மொழிகளில், '''சப்டைப்பிங் பாலிமார்பிஸம்''' (சிலநேரங்களில் டைனமிக் பாலிமார்பிஸம் என்று அழைக்கப்படுவது) குறிப்பிட்ட டைப் ''T'' இன் நோக்கத்தை எடுத்துக்கொள்ள எழுதப்படுவதற்கான செயல்பாட்டை அனுமதிக்கின்றன, ஆனால் ''T'' இன் (லிஸ்கோவ் சப்ஸ்டிட்யூஷன் பிரின்ஸிபிளின்படி) சப்டைப்பாக உள்ள டைப் ''S'' இடம் இருக்கும் ஆப்ஜெக்டை கடத்தியது என்றால் சரியாகவே செயல்படுகிறது என்றாகும். இந்த டைப் உறவு சில நேரங்களில் ''S'' <: ''T'' என்று எழுதப்படுகிறது. முரணாக ''T'' ஆனது ''S'' இன் ''சூப்பர்டைப்'' என்று சொல்லப்பட்டு ''T'' :> ''S'' என்று எழுதப்படுகிறது.


உதாரணத்திற்கு, <code>Number</code>, <code>Rational</code>, மற்றும் <code>Integer</code> ஆகியவை <code>Number</code> :> <code>Rational</code> மற்றும் <code>Number</code> :> <code>Integer</code> டைப் என்றால் <code>Number</code> ஐ எடுத்துக்கொள்ளும் ஒரு செயல்பாடு <code>Number</code> ஐ ஏற்கும்போதைய <code>Integer</code> அல்லது <code>Rational</code> ஏற்கப்படும்போது சமமாக செயல்படும். இந்த ஆப்ஜெக்டின் அசல் டைப் கிளைண்ட்களிடமிருந்து பிளாக் பாக்ஸிற்குள்ளாக மறைக்கப்படலாம் என்பதோடு ஆப்ஜெக்ட் அடையாளப்படுத்தல் வழியாக அனுகப்படலாம்.
உண்மையில், <code>Number</code> டைப் ''அரூபமானது'' என்றால் ''அதிகம்-தருவிக்கப்பட்ட'' டைப் <code>Number</code> ஆக இருப்பவற்றின் மீது உங்கள் கைகளை வைப்பது சாத்தியமாகமலே போகலாம் (அப்ஸ்ட்ராக்ட் டேட்டா டைப், அப்ஸ்ட்ராக்ட் கிளாஸ்). இந்த குறிப்பிட்ட வகையிலான டைப் படிநிலை - குறிப்பாக ஸ்கீம் புரோகிராமிங் லாங்குவேஜ் வகையில் - ''நியூமரிக் டவர்'' என்று அறியப்படுவதோடு வழக்கமாக மிக அதிகமான டைப்களைக் கொண்டிருக்கின்றன.


ஆப்ஜெக்ட்-சார்ந்த நிரலாக்க மொழிகள் ''சப்கிளாஸிங்கைப்'' (''இன்ஹெரிட்டன்ஸ்'' என்றும் அறியப்படுவது) பயன்படுத்தும் சப்டைப்பிங் பாலிமார்பிஸத்தை வழங்குகின்றன. வகைமாதிரியான அமலாக்கங்களில், ஒவ்வொரு கிளாஸூம் ''வர்ச்சுவல் டேபிள்'' எனப்படுபனவற்றைக் கொண்டிருக்கின்றன - கிளாஸ் இடைமுகத்தின் பாலிமார்பிக் பகுதியை அமல்படுத்துகின்ற செயல்பாடுகளின் அட்டவணை - என்பதோடு ஒவ்வொரு ஆப்ஜெக்டும் அதனுடைய கிளாஸின் "விடேபிளிற்கான" பாய்ண்டரை உள்ளிட்டிருக்கின்றன, இது பின்னர் பாலிமார்பிக் செயல்பாடு அழைக்கப்படும்போதெல்லாம் ஆலோசிக்கப்படுகிறது. இந்த இயக்கவியல் பின்வருவனவற்றின் உதாரணமாகும்:

* ''லேட் பைண்டிங்'' , ஏனெனில் வர்ச்சுவல் செயல்பாடு நாடிச்செல்லப்படும்வரை பிணைப்புறுவதில்லை, மற்றும்
* ''சிங்கிள் டெஸ்பேட்ச்'' (எ.கா., சிங்கிள்-ஆர்க்யுமெண்ட் பாலிமார்பிஸம்), ஏனென்றால் முதல் ஆர்க்யூமெண்டால் வழங்கப்பட்ட விடேபிள் வழியாக பார்க்கப்படுவதன் மூலமே வர்ச்சுவல் ஃபங்ஷன் அழைப்புக்கள் பிணைப்புற்றுவிடுகின்றன (<code>this</code> ஆபஜெக்ட்), எனவே மற்ற ஆர்க்யூமெண்ட்களின் செயல்பாட்டுநேர டைப்கள் முற்றிலும் தொடர்பற்றவையாகிவிடுகின்றன.
இதேவிதத்திலானவைதான் பெரும்பாலான மற்ற பிரபல ஆப்ஜெக்ட் அமைப்புக்களிலும் நடக்கின்றன. இருப்பினும், சிஎல்ஓஎஸ் போன்ற சில ''மல்டிபிள் டெஸ்பேட்ச்சை'' வழங்குகின்றன, இதன் முறையிலான அழைப்புகள் ''எல்லா'' ஆர்க்யூமெண்ட்களிலுமான பாலிமார்பிக் எனப்படுகிறது.



== துவக்ககால பிணைப்புறு மொழிகளிலான அட்-ஹாக் பாலிமார்பிஸம் ==
{{Disputed-section|date=March 2008}}


வெவ்வேறு டைப்களின் ஆர்க்யூமெண்ட்களுக்கு பயன்படுத்தப்படும் பாலிமார்பிக் ஃபங்ஷன்களை குறிப்பிடுவதற்கு '''அட்-ஹாக் பாலிமார்பிஸம்''' என்ற சொல்பதத்தை ஸ்ட்ராச்சி<ref>சி. ஸட்ராச்சி, ஃபண்டமெண்டல் கான்செப்ட்ஸ் இன் புரோகிராமிங் லாங்குவேஜஸ். கணிப்பொறி நிரலாக்கம் குறித்த சர்வதேச கோடைகாலப் பள்ளிக்கான விரிவுரைக் குறிப்புகள், கோபன்ஹேன், ஆகஸ்ட் 1967</ref> தேர்வுசெய்தார், ஆனால் இது அவை பயன்படுத்தப்படுகின்ற ஆர்க்யூமெண்ட் வகையைப் பொறுத்து '''வித்தியாசமாக''' செயல்படுவது ('''ஃபங்ஷன் ஓவர்லோடிங்''' என்றும் அறியப்படுவது). இந்தவிடத்திலான "அட்-ஹாக்" என்ற சொற்பதம் பண்பு குறைப்பதற்கான உள்நோக்கத்தோடு பயன்படுத்தப்படுவதில்லை; இந்த வகை பாலிமார்பிஸம் டைப் சிஸ்டத்தின் அடிப்படை அம்சம் அல்ல என்ற உண்மையை மட்டுமே குறிப்பதற்கானதாகும்.


அட்-ஹாக் பாலிமார்பிஸம் என்பது ஒரு டெஸ்பேட்ச் இயக்கவியலாகும்: ஒரு பெயரிடப்பட்ட ஃபங்ஷன் வழியாக கட்டுப்பாட்டு நகர்வு உரிய ஃபங்ஷனைக் குறிப்பிடாமலேயே மற்ற ஃபங்ஷன்களுக்கு டெஸ்பேட்ச் செய்யப்படுவதாகும். ஒரே பெயரில் வரையறுத்துக்கொள்வதற்கான வெவ்வேறு வகைகளை மல்பிடிபிள் ஃபங்ஷன்களை செயல்படுத்த ஓவர்லோடிங் அனுமதிக்கிறது; கம்பைலர் அல்லது இண்டர்பிரட்டர் தாமாகவே சரியான ஒன்றை அழைக்கிறது. இம்முறையில், ஃபங்ஷன்கள் இண்டீஜர்களின் பட்டியல்கள், ஸ்ட்ரிங்ஸ்களின் பட்டியல்கள், உண்மை எண்களின் பட்டியல்கள் ஆகியவற்றை அப்பெண்ட் செய்துகொண்டு எழுதப்படலாம், இவை அனைத்தும் ''append'' எனப்படுகின்றன - வலது ''append'' ஃபங்ஷன் அப்பெண்ட் செய்யப்படும் பட்டியல்களின் டைப் அடிப்படையில் அழைக்கப்படலாம். எந்த வகையிலான பட்டியலுடன் எழுதப்படுவதற்கான ''ஜெனரிக்காக'' எழுதப்படக்கூடிய ஃபங்ஷன் தேவைப்படுகின்ற பாராமெட்ரிக் பாலிமார்பிஸத்திலிருந்து இது மாறுபடுகிறது. ஓவர்லோடிங்கைப் பயன்படுத்துவது, ஏற்கப்படும் உள்ளீட்டு வகையின் அடிப்படையில் அமைந்த இரண்டு முற்றிலும் வெவ்வேறு விஷயங்களை செயல்படுத்துவது சாத்தியம்தான். ஓவர்லோடிங்கைப் பார்ப்பதற்கான மற்றொரு முறை ரெட்டீன் தனித்துவமான முறையில் அதனுடைய பெயரைக் கொண்டு அடையாளம் காணப்படுவதில்லை, ஆனால் அதனுடைய பெயர் மற்றும் எண்ணின் கலப்பு, அதன் பாராமீட்டர்களுடைய ஒழுங்கு மற்றும் டைப்களின் அடிப்படையிலேயே ஆகும்.


இந்த வகை பாலிமார்பிஸம் ஆப்ஜெக்ட்-சார்ந்த நிரலாக்க மொழிகளில் பொதுவானது, இவற்றில் பலவும் ஃபங்ஷன்கள் போன்றே இருக்கும் முறையில் ஓவர்லோட் செய்யப்படுவதற்கு ஆபரேட்டரை அனுமதிப்பவையாக இருக்கின்றன (பார்க்க ஆபரேடர் ஓவர்லோடிங்). டைனமிக்காக டைப் செய்யப்படாத மற்றும் அட்-ஹாக் பாலிமார்பிஸம் இல்லாத (டைப் கிளாஸஸ் உட்பட) சில மொழிகள் <code>print_int</code>, <code>print_string</code> போன்ற நீளமான ஃபங்ஷன் பெயர்களைக் கொண்டிருக்கின்றன. இது ஒருவருடைய கண்ணோட்டத்தைப் பொறுத்து அனுகூலமானதாகவோ (மிகுந்த விவரமானது) அல்லது அனுகூலமற்றதாகவோ (அதிக நீளமான வார்த்தையுள்ளது) பார்க்கப்படலாம்.


ஓவர்லோடிங்கிலிருந்து சிலநேரங்களில் பெறப்படும் அனுகூலம் என்னவெனில் நிபுணத்தின் தோற்றமேயாகும். எ.கா., ஓரே பெயர் உள்ள ஃபங்ஷன் பல்வேறு வேறுபட்ட முறைகளில் அமல்படுத்தப்படலாம், ஒவ்வொன்றும் அது செயல்படுத்தும் குறிப்பிட்ட டேட்டா டைப்பிற்காக அனுகூலமாக்கப்படுகிறது. செயல்திறன் காரணங்களுக்காக பல்வேறுவிதமான சூழ்நிலைகளுக்கு நிபுணத்துவம் பெறுவதற்கான தேவைகள் உள்ள குறியாக்கத்திற்கு இது ஒரு சௌகரியமான இடைமுகத்தை வழங்க முடியும்.


கம்பைல் நேரத்தில் ஓவர்லோடிங் செய்யப்படுகிறது என்பதால், சப்டைப்பிங் பாலிமார்பிஸத்தில் காணப்படுவதுபோன்று இது லேட் பைண்டிங்கிற்கு பதிலீடு செய்யப்படுவதில்லை.



== லேட் பவுண்ட் மொழிகளுக்கான அட்-ஹாக் பாலிமார்பிஸம் ==


முந்தை பிரிவின் பொருட்டின்றி, அட்-ஹாக் பாலிமார்பிஸத்தை செயல்படுத்துவதற்கான பல வழிகள் உள்ளன. ஸ்மால்டாக் மொழியை உதாரணமாக எடுத்துக்கொள்ளலாம். ஸ்மால்டாக்கில், ஓவர்லோடிங் செயல்பாட்டு நேரத்தில் செய்யப்படுகிறது ஏனென்றால் ஒவ்வொரு ஓவர்லோட் செய்யப்பட்ட செய்திக்குமான ("ஓவர்லோட் செய்யப்பட்ட ஃபங்ஷன்") முறைகள் ("ஃபங்ஷன் அமலாக்கம்") அவை நிறைவேற்றம் செய்யப்படுகின்றபோது தீர்க்கப்படுகின்றன. இது நிரல் கம்பைல் செய்யப்பட்ட பின்னர் செயல் நேரத்தில் நடக்கிறது. ஆகவே, பாலிமார்பிஸம் மற்ற மொழிகளில் உள்ளதுபோன்று சப்டைப்பிங் பாலிமார்பிஸத்தால் வழங்கப்படுகிறது என்பதுடன் இது செயல் நேரத்தில் அட்-ஹாக் பாலிமார்பிஸத்தால் செயல்பாட்டிலும் நீட்டிக்கப்படுகிறது.


ஸ்மால்டாக்கானது அட்-ஹாக் பாலிமார்பிஸத்தின் சற்றே வேறுபட்ட வகையினத்தை வழங்குவதை நெருங்கிச் சென்று காண்கையில் தெரியும். ஸ்மால்டாக் லேட் பவுண்ட் செயல்நிறைவேற்ற மாதிரியைக் கொண்டிருப்பதால், புரிந்துகொள்ளப்படாத செய்திகளைக் கையாளுவதற்கான திறனை ஆப்ஜெக்ட்களுக்கு வழங்குவதால், முன்னோக்கிச் சென்று ஒரு குறிப்பிட்ட செய்தியை வெளிப்படையாக ஓவர்லோட் செய்யாமல் பாலிமார்பிஸத்தைப் பயன்படுத்தும் செயல்பாட்டை அமலாக்க முடியும். இது தினசரி நிரலாக்கத்திற்கு பொதுவாக பரிந்துரைக்கப்பட்டதாக இல்லாதிருக்கலாம், ஆனால் இது பிராக்ஸிகளை அமலாக்கும்போது முற்றிலும் பயன்மிக்கவையாகும்.


அத்துடன், பொதுவான நிபந்தனைகளிடத்தில் கிளாஸ் முறை மற்றும் கன்ஸ்ட்ரக்டர் ஓவர்லோடிங் பாலிமார்பிஸமாக கருதப்படுவதில்லை, கிளாஸ்கள் சாதாரண ஆப்ஜெக்ட்களாக இருக்கக்கூடிய ஒரேவிதமான பல மொழிகள் இருக்கின்றன. உதாரணத்திற்கு, ஸ்மால்டாக்கில் கிளாஸ்கள் சாதாரணமான ஆப்ஜெக்ட்களாகும். மாற்றாக, இது கிளாஸ்களுக்கு அனுப்பப்படும் செய்திகள் ஓவர்லோட் ஆகலாம் என்பதைக் குறிப்பதோடு, கிளஸ்களின் படிவரிசையிலிருந்து தங்களது கிளாஸ்களைப் பெற்றுக்கொள்ளாத கிளாஸ்கள் போன்று நடந்துகொள்ளும் ஆப்ஜெக்டகளை உருவாக்குவதும் சாத்தியம்தான். இவை ஸ்மால்டாக்கின் சக்திமிகுந்த பிரதிபலிப்பினுடைய அனுகூலத்தைப் பயன்படுத்திக்கொள்ளக்கூடிய பயன்மிக்க உத்திகளாகும். செல்ஃப் மற்றும் நியூஸ்பீக் போன்ற மொழிகளிலும் இதேபோன்ற ஏற்பாடுகள் சாத்தியமாகின்றன.



== உதாரணம் ==
இந்த உதாரணம் இந்தக் கட்டுரையில் விவரிக்கப்பட்டுள்ள வெவ்வேறு வகையிலான பாலிமார்பிஸத்தை விளக்கும் நோக்கம் கொண்டது. இருப்பினும் இந்த முறையில் பரந்த அளவிலான வேறுபட்ட விஷயங்களை செய்வதற்கு அசலில் அரித்மேட்டிக் ஆபரேட்டரை ஓவர்லோட் செய்வது மிகவும் தெளிவான உதாரணமாக இல்லாதிருக்கலாம், இது சில நுட்பமான குறிப்புகளை உருவாக்கவும் அனுமதிக்கிறது. நடைமுறையில், வெவ்வேறுவிதமான பாலிமார்பிஸம்கள் இங்கே இருப்பவை போன்று பொதுவாக கலந்துவிடுவதில்லை.


ஒரு ஆபரேட்டர் <code>+</code> ஐ கற்பனை செய்துகொள்வது பின்வரும் முறைகளில் உதவிகரமானதாக இருக்கலாம்:

# <code>1 + 2 = 3</code>
# <code>3.14 + 0.0015 = 3.1415</code>
# <code>1 + 3.7 = 4.7</code>
# <code>[1, 2, 3] + [4, 5, 6] = [1, 2, 3, 4, 5, 6]</code>
# <code>[true, false] + [false, true] = [true, false, false, true]</code>
# <code>"foo" + "bar" = "foobar"</code>



=== ஓவர்லோடிங் ===
இந்த ஆறு ஃபங்ஷன் அழைப்புக்களை கையாளுவதற்கு நான்கு வெவ்வேறுவித குறியாக்கம் தேவைப்படுகிறது- அல்லது ''மூன்று'' , ஸ்ட்ரிங்ஸ்கள் தனிக்குறியீடுகளாக கருதப்படும்போது:

* முதல் நிகழ்வில், இண்டீஜரின் கூடுதல் கொண்டுவரப்பட வேண்டும்.
* இரண்டாவது மற்றும் மூன்றாவது நிகழ்வுகளில் ஃப்ளோட்டிங்-பாய்ண்ட் கொண்டுவரப்பட வேண்டும் (மூன்றாவது நிகழ்வில் உள்ள 0}டைப் புரமோஷன், அல்லது டைப் கோயர்ஸன் உடன்).
* நான்காவது மற்றும் ஐந்தாவது நிகழ்வுகளில் [[பட்டியல்]] தொடர்வரிசையாக்கம் கொண்டுவரப்பட வேண்டும்.
* கடைசி நிகழ்வில், ஸ்ட்ரிங் தொடர்வரிசையாக்கம் கொண்டுவரப்பட வேண்டும், இதுவும்கூட பட்டியல் தொடர்வரிசையாக்கமாக கையாளப்படாதவரை (எ.கா., ஹேஸ்கல்).
இவ்வாறு, <code>+</code> என்ற பெயர் உண்மையில் மூன்று அல்லது நான்கு முற்றிலும் வேறுபட்ட ஃபங்ஷன்களை குறிப்பதாகும். இது ''ஓவர்லோடிங்கின்'' உதாரணமாகும்.



== மேலும் பார்க்க ==

* ஆப்ஜெக்ட்-சார்ந்த நிரலாக்கத்தில் பாலிமார்பிஸம்
* டைப்கள் இல்லாமல் (ஸ்டேடிக்) பாலிமார்பிஸத்திற்கான டக் டைப்பிங்
* பாலிமார்பிக் குறியாக்கம் (கம்ப்யூட்டர் வைரஸ் சொற்பதம்)
* பாராமெட்ரிக் பாலிமார்பிஸத்துடனான லம்டா கால்குலஸிற்கான சிஸ்டம் எஃப்.
* வர்ச்சுவல் இன்ஹெரிட்டன்ஸ்



== பார்வைக் குறிப்புகள் ==

* லூகா கார்டெல்லி, பீட்டர் வேக்னர். ''[http://lucacardelli.name/Papers/OnUnderstanding.A4.pdf ஆன் அண்டர்ஸ்டேண்டிங் டைப்ஸ், டேட்டா அப்ஸ்ட்ராக்ஷன், அண்ட் பாலிமார்பிஸம்],'' கம்ப்யூட்டிங் சர்வேஸிலிருந்து, (டிசம்பர், 1985)
* பிலிப் வாட்லர், ஸ்டீபன் பிளாட். ''[http://citeseer.ist.psu.edu/wadler88how.html ஹவ் டு மேக் அட்-ஹாக் பாலிமார்பிஸம் லெஸ் அட் ஹாக்],'' பிராக். இல் இருந்து நிரலாக்க மொழிகளின் கொள்கைகள் குறித்த 16வது ஏசிஎம் கருத்தரங்கம், (ஜனவரி, 1989)
* கிறிஸ்டோபர் ஸ்ட்ராச்சி. ''[http://scholar.google.com/scholar?q=Strachey+%22Fundamental+Concepts+in+Programming+Languages%22 ஃபண்டமெண்டல் கான்செப்ட்ஸ் இன் புரோகிராமிங் லாங்குவேஜ்],'' ஹையர் ஆர்டர் அண்ட் சிம்பாலிக் கம்ப்யூட்டேஷனிலிருந்து, (ஏப்ரல், 2000; 1967 தேதியிட்ட அசல் கட்டுரை)
* பால் ஹுடாக், ஜான் பீ்ட்டர்ஸன், ஜோசப் ஃபேஸல். ''[http://www.haskell.org/tutorial/ எ ஜென்டில் இண்ட்ரடக்ஸன் டு ஹேஸ்கல் வெர்ஸன் 98]'' .
* பூக், மற்றும் சிலர். ''ஆப்ஜெக்ட்-ஓரியண்டட் அனாலிஸில் அண்ட் சிம்பிள் டிசைன் வித் அப்ளிகேஷன்'' .
<references></references>



== வெளிப்புற இணைப்புகள் ==

* [http://www.cplusplus.com/doc/tutorial/polymorphism.html பாலிமார்பிஸத்தின் C++ உதாரணங்கள்]
* [http://wiki.visual-prolog.com/index.php?title=Objects_and_Polymorphism ஆப்ஜெக்ட்களும் பாலிமார்பிஸமும் (விஷுவல் புரோலாக்)]

[[பகுப்பு:ஃபங்ஷனல் புரோகிராமிங்]]
[[பகுப்பு:ஆப்ஜெக்ட்-சார்ந்த நிரலாக்கம்]]
[[பகுப்பு:டைப் கோட்பாடு]]
[[பகுப்பு:தரவு வகைகள்]]

[[be-x-old:Палімарфізм]]
[[bg:Полиморфизъм (информатика)]]
[[bs:Polimorfizam (informatika)]]
[[cs:Polymorfismus (programování)]]
[[de:Polymorphie (Programmierung)]]
[[en:Polymorphism (computer science)]]
[[es:Polimorfismo (informática)]]
[[et:Polümorfism (informaatika)]]
[[fr:Polymorphisme (informatique)]]
[[he:פולימורפיזם (תוכנה)]]
[[hi:पोलिमोर्फ़िज्म (कंप्यूटर विज्ञान)]]
[[it:Polimorfismo (informatica)]]
[[ja:ポリモーフィズム]]
[[ko:다형성]]
[[lt:Polimorfizmas (programavime)]]
[[nl:Polymorfisme (informatica)]]
[[pl:Polimorfizm (informatyka)]]
[[pt:Polimorfismo]]
[[ru:Полиморфизм (программирование)]]
[[sv:Polymorfism (objektorienterad programmering)]]
[[te:పాలీ మార్ఫిజం (బహురూపత)(కంప్యూటర్ సైన్సు)]]
[[uk:Поліморфізм (програмування)]]

19:52, 10 ஏப்பிரல் 2011 இல் நிலவும் திருத்தம்

பொருள் நோக்கு நிரலாக்கத்தில், பல்லுருத்தோற்றம் (Polymorphism) என்பது ஒரு வகுப்பின் செயலிகளை, மாறிகளை, அல்லது பொருட்களை அந்த வகுப்பின் subclasses தமது தேவைகளுக்கு ஏற்றமாதிரி நிறைவேற்ற முடியும் என்ற கூற்றாகும்.

எடுத்துக்காட்டுக்கள்

பி.எச்.பி

PHP

<?php

interface IAnimal
{
    function getName();
    function talk();
}

abstract class AnimalBase implements IAnimal
{
    protected $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }
}

class Cat extends AnimalBase
{

    public function talk()
    {
        return "Meowww!";
    }
}

class Dog extends AnimalBase
{

    public function talk()
    {
        return "Arf! Arf!";
    }
}

$animals = array(
    new Cat("Missy"),
    new Cat("Mr. Mistoffelees"),
    new Dog("Lassie")
);

foreach ($animals as $animal) {
    echo $animal->getName() . ": " . $animal->talk();
}

?>

பெர்ள்

Perl

Polymorphism in Perl is inherently straightforward to write because of the language's use of sigils and references. This is the Animal example in standard OO Perl:

package Animal;
sub new {
    my ($class, $name) = @_;
    bless {name => $name}, $class;
}   

package Cat;
@ISA = "Animal";
sub talk {"Meow"}

package Dog;
@ISA = "Animal";
sub talk {"Woof! Woof!"}

package main;
my @animals = (
    Cat->new("Missy"),
    Cat->new("Mr. Mistoffelees"),
    Dog->new("Lassie"),
);
for my $animal (@animals) {
    print $animal->{name} . ": " . $animal->talk . "\n";
}

# prints the following:
#
# Missy: Meow
# Mr. Mistoffelees: Meow
# Lassie: Woof! Woof!

This means that Perl can also apply polymorphism to the method call. The example below is written using the Moose module in order to show modern OO practises in Perl (it is not required for method polymorphism):

{
    package Animal;
    use Moose;
    has 'name' => ( isa => 'Str', is => 'ro' );
}

{
    package Cat;
    use Moose;
    extends 'Animal';
    sub talk  { 'Meow' }
    sub likes { 'Milk' }
}

{
    package Dog;
    use Moose;
    extends 'Animal';
    sub talk  { 'Woof! Woof!' }
    sub likes { 'Bone' }
}

my @animals = (
    Cat->new( name => 'Missy' ),
    Cat->new( name => 'Mr. Mistoffelees' ),
    Dog->new( name => 'Lassie' ),
);

for my $animal ( @animals ) {
    for my $trait qw/talk likes/ {
        print $animal->name . ': ' . $trait . ' => ' . $animal->$trait;
    }
}

# prints the following:
#
# Missy: talk => Meow
# Missy: likes => Milk
# Mr. Mistoffelees: talk => Meow
# Mr. Mistoffelees: likes => Milk
# Lassie: talk => Woof! Woof!
# Lassie: likes => Bone


வெளி இணைப்புகள்