Sobes.tech
Middle

Τι είναι οι γενικεύσεις (Generics) στον προγραμματισμό;

sobes.tech AI

Απάντηση από AI

Οι Γενικεύσεις (Generics) είναι ένας μηχανισμός στις γλώσσες προγραμματισμού που επιτρέπει τη δημιουργία συστατικών (κλάσεων, διεπαφών, μεθόδων/λειτουργιών) που λειτουργούν με διαφορετικούς τύπους δεδομένων, χωρίς να χάνουν την τύπου ασφαλεία και χωρίς να χρειάζεται να κάνουμε μετατροπές τύπων (casting).

Οι βασικοί στόχοι της χρήσης των Generics:

  • Αυξημένη ασφάλεια τύπων: Ο μεταγλωττιστής ελέγχει τους τύπους κατά τη μεταγλώττιση, εντοπίζοντας σφάλματα πριν την εκτέλεση του προγράμματος.
  • Βελτίωση αναγνωσιμότητας κώδικα: Είναι σαφές με ποιους τύπους δεδομένων εργάζεται το συστατικό.
  • Επαναχρησιμοποίηση κώδικα: Μπορεί να δημιουργηθεί ένα συστατικό που λειτουργεί με διαφορετικούς τύπους, αντί να γραφούν πολλές εκδόσεις.
  • Μείωση μετατροπών τύπων: Αποφεύγει την ανάγκη για ρητές μετατροπές τύπων, καθιστώντας τον κώδικα πιο καθαρό και λιγότερο επιρρεπή σε σφάλματα ClassCastException (σε γλώσσες όπου αυτό ισχύει, π.χ. Java).

Παραδείγματα χρήσης των Generics:

  • Συλλογές: Οι λίστες (List), τα σύνολα (Set), οι απεικονίσεις (Map) μπορούν να αποθηκεύουν στοιχεία συγκεκριμένου τύπου, διασφαλίζοντας ότι στη συλλογή δεν θα εισέλθουν στοιχεία άλλου τύπου.
  • Μέθοδοι/λειτουργίες: Μια μέθοδος μπορεί να λειτουργεί με παραμέτρους ή να επιστρέφει τιμή γενικού τύπου.
  • Κλάσεις/διεπαφές: Μπορούν να δημιουργηθούν δομές δεδομένων ή πρότυπα συμπεριφοράς.

Παράδειγμα σε Java:

// Γενική κλάση ζεύγους
public class Pair<T, U> {
    private T first;
    private U second;

    public Pair(T first, U second) {
        this.first = first;
        this.second = second;
    }

    public T getFirst() {
        return first;
    }

    public U getSecond() {
        return second;
    }
}

// Χρήση
Pair<String, Integer> pair = new Pair<>("Hello", 123);
String str = pair.getFirst(); // Δεν χρειάζεται μετατροπή τύπων
int num = pair.getSecond();   // Δεν χρειάζεται μετατροπή τύπων

// Pair<String, Integer> wrongPair = new Pair<>(123, "Hello"); // Σφάλμα μεταγλώττισης: ασυμφωνία τύπων

Παράδειγμα σε C#:

// Γενική κλάση Pair
public class Pair<T, U>
{
    public T First { get; set; }
    public U Second { get; set; }

    public Pair(T first, U second)
    {
        First = first;
        Second = second;
    }
}

// Χρήση
var pair = new Pair<string, int>("Hello", 123);
string str = pair.First; // Δεν χρειάζεται μετατροπή τύπων
int num = pair.Second;   // Δεν χρειάζεται μετατροπή τύπων

// var wrongPair = new Pair<string, int>(123, "Hello"); // Σφάλμα μεταγλώττισης: ασυμφωνία τύπων

Παράδειγμα σε TypeScript:

// Γενική λειτουργία για την απόκτηση του πρώτου στοιχείου ενός πίνακα
function getFirstElement<T>(arr: T[]): T | undefined {
    if (arr.length > 0) {
        return arr[0];
    }
    return undefined;
}

// Χρήση
let numbers: number[] = [1, 2, 3];
let firstNumber = getFirstElement(numbers); // firstNumber έχει τύπο number

let words: string[] = ["a", "b", "c"];
let firstWord = getFirstElement(words);   // firstWord έχει τύπο string

// let mixedArray: (number | string)[] = [1, "a", 2];
// let firstMixed = getFirstElement(mixedArray); // firstMixed έχει τύπο number | string

Έτσι, τα Generics αποτελούν ένα ισχυρό εργαλείο για τη δημιουργία ευέλικτου, ασφαλούς τύπου και επαναχρησιμοποιήσιμου κώδικα.