polymorphism |
---|
ad hoc polymorphism |
parametric polymorphism |
subtyping |
parametric polymorphism (tsz. parametric polymorphisms)
template
mechanizmusa vagy Java generics
rendszere.
template
segítségével)template <typename T>
T maximum(T a, T b) {
return (a > b) ? a : b;
}
Használat:
maximum(3, 7); // int
maximum(3.14, 2.71); // double
maximum("apple", "pear"); // const char*
Itt T
a típusparaméter – ez a paraméteres polimorfizmus példája.
generics
segítségével)public class Box<T> {
private T item;
public void set(T item) { this.item = item; }
public T get() { return item; }
}
Box<Integer> b1 = new Box<>();
Box<String> b2 = new Box<>();
A T
típus bármilyen típussal helyettesíthető.
length :: -> Int
A length
függvény bármilyen típusú lista hosszát visszaadja – a
lehet Int
, Char
, Bool
, stb. Ez a tiszta paraméteres polimorfizmus példája.
Típus | Leírás |
---|---|
Parametric polymorphism | A függvény/osztály típusparaméterekre általános |
Subtype polymorphism (alapú típus) | A függvények az alosztályok példányain is működnek (pl. C++ virtuális függvények, Java override) |
Ad-hoc polymorphism | Függvények különböző típusokra más implementációt kapnak (pl. overloading, type class instance) |
template<typename T>
– típusparaméterekvector<T>
, map<K, V>
) is paraméteres polimorfizmust használnakconstexpr
, SFINAE
, concepts
eszközökkel
Előny | Magyarázat |
---|---|
Kód újrahasznosítás | Egyetlen általános megvalósítás több típusra |
Típusbiztonság | Fordítás idején történik típusellenőrzés |
Olvashatóság | Nincs szükség ismételt kódra minden típushoz |
Hátrány | Magyarázat |
---|---|
Nehezebb hibakeresés | Bonyolult hibaüzenetek sablonpéldányosításkor (C++) |
Fordítási idő | Sok típuspéldányosítás lelassíthatja a buildet |
Kódrobbanás | Minden típuspéldány külön gépi kódot eredményezhet (C++) |
template <typename T>
class Pair {
public:
T first, second;
Pair(T a, T b) : first(a), second(b) {}
T max() const { return (first > second) ? first : second; }
};
Pair<int> p1(1, 5);
Pair<double> p2(3.14, 2.71);
Mindkét Pair<T>
típus ugyanazt a sablont használja, különböző típusparaméterrel – ez a paraméteres polimorfizmus.
Parametric polymorphism azt jelenti, hogy ugyanazt a kódot többféle típusra is használhatjuk, a típust paraméterként megadva. Ez a sablonok (
template
), generikus programozás, és funkcionális nyelvek egyik legfontosabb képessége.