В объектно-ориентированном программировании существуют три основных типа полиморфизма:
1. Полиморфизм подтипов (subtyping polymorphism) - возможность использовать объекты различных классов, производных от одного базового класса, с помощью ссылки на базовый класс. При вызове метода через ссылку на базовый класс, будет выполнен соответствующий метод класса-потомка. Это основной тип полиморфизма в языках, таких как Java и C#.
Пример:
```
class Animal {
public virtual void MakeSound()
{
}
}
class Dog : Animal {
public override void MakeSound()
{
Console.WriteLine("Bark");
}
}
class Cat : Animal {
public override void MakeSound()
{
Console.WriteLine("Meow");
}
}
Animal animal = new Dog();
animal.MakeSound(); // Выведет "Bark"
animal = new Cat();
animal.MakeSound(); // Выведет "Meow"
```
2. Параметрический полиморфизм (parametric polymorphism) - возможность написания обобщенного кода, который может работать с разными типами данных. В языках программирования, таких как C++ и C#, это реализуется с помощью шаблонов (templates/generics). Позволяет использовать один и тот же код для различных типов данных без необходимости его повторного написания.
```
// Шаблонный класс в C++
template<class T>
class Container {
T element;
public:
void SetElement(T value) { element = value; }
T GetElement() const { return element; }
};
Container<int> intContainer;
intContainer.SetElement(42);
int intValue = intContainer.GetElement(); // intValue будет равно 42
Container<string> stringContainer;
stringContainer.SetElement("Hello");
string stringValue = stringContainer.GetElement(); // stringValue будет равно "Hello"
```
3. Ad hoc полиморфизм (ad hoc polymorphism) - возможность использования одного и того же имени метода или оператора с разными типами данных. Обычно реализуется с помощью перегрузки методов/операторов или расширений методов.
Пример перегрузки методов:
```
int Add(int a, int b) { return a + b; }
double Add(double a, double b) { return a + b; }
int result1 = Add(1, 2); // result1 будет равно 3
double result2 = Add(1.5, 2.5); // result2 будет равно 4.0
```
Пример расширений методов (extension methods) в C#:
```
static class StringExtensions {
public static bool IsPalindrome(this string str)
{
// Логика проверки на палиндром
}
}
string word = "radar";
bool isPalindrome = word.IsPalindrome(); // isPalindrome будет равно true
```
Кроме того, некоторые источники также упоминают порождающий полиморфизм (parametric polymorphism), который позволяет создавать новые типы на основе существующих. Этот тип полиморфизма встречается в контексте языков программирования с мощной системой типов, таких как Haskell или OCaml, и обычно относится к системе типов как целому, а не к отдельной функции или методу.