Какие виды полиморфизма существуют?

  • 12 августа 2023 г. 16:26
Ответы на вопрос 5
В объектно-ориентированном программировании существуют три основных типа полиморфизма:

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, и обычно относится к системе типов как целому, а не к отдельной функции или методу.
ad-hoc - это когда одно и то же имя функции используется для нескольких разных реализаций в зависимости от типов параметров.
Методы расширения - это способ добавления новых методов к уже существующим типам данных без необходимости изменения самих типов данных.
Полиморфизм подтипов - это когда объекты одного класса могут быть использованы вместо объектов другого класса при наследовании или реализации интерфейсов.
Параметрический полиморфизм - это когда функции или типы данных могут работать с абстрактными типами, определенными пользователем, которые могут быть конкретизированы различными типами данных.
Похожие вопросы