Полиморфизм - это способность программиста писать методы с одинаковыми именами, которые делают разные вещи для разных типов объектов, в зависимости от потребностей этих объектов. Например, если вы разрабатываете класс с именем Fraction
и класс с именем ComplexNumber
, оба они могут включать метод с именем display()
, но каждый из них реализует этот метод по-своему. В PHP, например, вы можете реализовать это так:
// Class definitions
class Fraction
{
public $numerator;
public $denominator;
public function __construct($n, $d)
{
// In real life, you'd do some type checking, making sure $d != 0, etc.
$this->numerator = $n;
$this->denominator = $d;
}
public function display()
{
echo $this->numerator . '/' . $this->denominator;
}
}
class ComplexNumber
{
public $real;
public $imaginary;
public function __construct($a, $b)
{
$this->real = $a;
$this->imaginary = $b;
}
public function display()
{
echo $this->real . '+' . $this->imaginary . 'i';
}
}
// Main program
$fraction = new Fraction(1, 2);
$complex = new ComplexNumber(1, 2);
echo 'This is a fraction: '
$fraction->display();
echo "\n";
echo 'This is a complex number: '
$complex->display();
echo "\n";
Выходы:
This is a fraction: 1/2
This is a complex number: 1 + 2i
Некоторые другие ответы, по-видимому, подразумевают, что полиморфизм используется только в сочетании с наследованием; например, возможно Fraction
и ComplexNumber
оба реализуют абстрактный класс с именем Number
, который имеет метод display()
, который затем обязаны реализовать Fraction и ComplexNumber. Но вам не нужно наследование , чтобы воспользоваться преимуществами полиморфизма.
По крайней мере, в динамически типизированных языках, таких как PHP (я не знаю, о C ++ или Java), полиморфизм позволяет разработчику вызывать метод, не зная заранее типа объекта и полагая, что правильная реализация метод будет вызван. Например, скажем, пользователь выбирает тип созданного Number
:
$userNumberChoice = $_GET['userNumberChoice'];
switch ($userNumberChoice) {
case 'fraction':
$userNumber = new Fraction(1, 2);
break;
case 'complex':
$userNumber = new ComplexNumber(1, 2);
break;
}
echo "The user's number is: ";
$userNumber->display();
echo "\n";
В этом случае будет вызван соответствующий метод display()
, хотя разработчик не может заранее знать, выберет ли пользователь дробь или комплексное число.