Στην C#, ένα αντικείμενο είναι μια συγκεκριμένη περίπτωση (instance) μιας κλάσης, και είναι το θεμελιώδες συστατικό του αντικειμενοστραφούς προγραμματισμού (OOP). Ένα αντικείμενο μπορεί να θεωρηθεί ως ένα “πράγμα” το οποίο έχει δύο βασικά χαρακτηριστικά:

  1. Δεδομένα (Ιδιότητες / Properties): Τα αντικείμενα περιέχουν δεδομένα, τα οποία είναι αποθηκευμένα σε πεδία ή ιδιότητες. Για παράδειγμα, ένα αντικείμενο αυτοκινήτου μπορεί να έχει ιδιότητες όπως το χρώμα, το μοντέλο και η ταχύτητα.
  1. Συμπεριφορές (Μεθόδοι / Methods): Τα αντικείμενα μπορούν επίσης να εκτελούν ενέργειες, οι οποίες καθορίζονται από μεθόδους. Για παράδειγμα, το αντικείμενο αυτοκινήτου μπορεί να έχει μια μέθοδο “Οδήγηση” ή “Φρενάρισμα”.

Δημιουργία Αντικειμένου

Για να δημιουργήσεις ένα αντικείμενο στην C#, πρώτα δημιουργείς μια κλάση που ορίζει τις ιδιότητες και τις μεθόδους. Στη συνέχεια, μπορείς να δημιουργήσεις ένα αντικείμενο αυτής της κλάσης χρησιμοποιώντας τον τελεστή new.

Παράδειγμα:

// Ορισμός της κλάσης Car


public class Car
{

    // Ιδιότητες (Properties)


    public string Color { get; set; }

    public string Model { get; set; }
    

    // Μέθοδος (Method)


    public void Drive()
    {
        Console.WriteLine("Το αυτοκίνητο οδηγείται.");
    }

}

// Δημιουργία αντικειμένου


Car myCar = new Car();
myCar.Color = "Κόκκινο";
myCar.Model = "Toyota";

myCar.Drive();  // Εκτυπώνει "Το αυτοκίνητο οδηγείται."

Κλάσεις και Αντικείμενα

  • Κλάση (Class): Η κλάση είναι το σχέδιο (blueprint) από το οποίο κατασκευάζονται αντικείμενα. Ορίζει τις ιδιότητες και τις μεθόδους που θα έχουν τα αντικείμενα.
  • Αντικείμενο (Object): Το αντικείμενο είναι η συγκεκριμένη περίπτωση (instance) μιας κλάσης. Κάθε αντικείμενο έχει τη δική του ανεξάρτητη κατάσταση (ιδιότητες) και μπορεί να εκτελεί τις μεθόδους του.

Χρήση Αντικειμένων

Τα αντικείμενα στην C# χρησιμοποιούνται για την οργάνωση και τη δομή του κώδικα. Επιτρέπουν την αναπαράσταση πραγματικών πραγμάτων ή αφηρημένων εννοιών και παρέχουν έναν σαφή και επαναχρησιμοποιήσιμο τρόπο διαχείρισης της λογικής του προγράμματος.

Με λίγα λόγια, τα αντικείμενα στην C# είναι οι κύριοι δομικοί λίθοι του αντικειμενοστραφούς προγραμματισμού και επιτρέπουν την αναπαράσταση και χειρισμό δεδομένων και συμπεριφορών με έναν οργανωμένο τρόπο.

Τι είναι τα αντικείμενα;

Όπως είπαμε, ένα αντικείμενο είναι μια συγκεκριμένη περίπτωση (instance) μιας κλάσης. Η κλάση είναι το “σχέδιο”, ενώ το αντικείμενο είναι το πραγματικό “αντίγραφο” που φτιάχνεις με βάση αυτό το σχέδιο.

Φαντάσου, για παράδειγμα, ότι η κλάση είναι η συνταγή για ένα κέικ, ενώ το αντικείμενο είναι το κέικ που έφτιαξες με βάση αυτή τη συνταγή. Μπορείς να φτιάξεις πολλά κέικ (αντικείμενα) από την ίδια συνταγή (κλάση), και κάθε κέικ μπορεί να έχει διαφορετικές γεύσεις ή μεγέθη (ιδιότητες).

Πώς δουλεύουν τα αντικείμενα;

Ας κάνουμε μια αναλογία με τον πραγματικό κόσμο:

Ας πούμε ότι έχεις μια κλάση Car που περιγράφει τα βασικά χαρακτηριστικά ενός αυτοκινήτου, όπως το χρώμα, το μοντέλο, και την ταχύτητα. Μπορείς να φτιάξεις διαφορετικά αυτοκίνητα (αντικείμενα) με βάση αυτή την κλάση.

Ιδιότητες και Μέθοδοι

Ένα αντικείμενο έχει δύο βασικά στοιχεία:

  1. Ιδιότητες (Properties): Αυτές είναι τα χαρακτηριστικά ή τα δεδομένα που περιγράφουν το αντικείμενο. Στο παράδειγμα με το αυτοκίνητο, οι ιδιότητες μπορεί να είναι το χρώμα, το μοντέλο, και η ταχύτητα.
  1. Μέθοδοι (Methods): Αυτές είναι οι λειτουργίες ή οι ενέργειες που μπορεί να κάνει το αντικείμενο. Στο παράδειγμα με το αυτοκίνητο, μπορεί να έχουμε μεθόδους όπως “οδήγηση” (drive) ή “φρενάρισμα” (brake).

Παράδειγμα:

Ας δημιουργήσουμε ένα πιο πλήρες παράδειγμα με αντικείμενα:

using System;

class Car
{
    // Ιδιότητες
    public string Color { get; set; }
    public string Model { get; set; }
    public int Speed { get; set; }

    // Μέθοδος για οδήγηση
    public void Drive()
    {
        Console.WriteLine($"{Model} οδηγείται με ταχύτητα {Speed} χλμ/ώρα.");
    }

    // Μέθοδος για φρενάρισμα
    public void Brake()
    {
        Speed = 0;  // Όταν φρενάρουμε, η ταχύτητα γίνεται 0
        Console.WriteLine($"{Model} έχει σταματήσει.");
    }
}

class Program
{
    static void Main()
    {
        // Δημιουργία αντικειμένου Car
        Car myCar = new Car();
        myCar.Color = "Κόκκινο";
        myCar.Model = "Toyota";
        myCar.Speed = 120;

        // Χρήση μεθόδων
        myCar.Drive();
        myCar.Brake();
    }
}

Τι βλέπουμε εδώ:

  • Δημιουργία της κλάσης Car: Στην κλάση Car ορίζουμε τις ιδιότητες Color, Model, και Speed, και έχουμε δύο μεθόδους Drive() και Brake().
  • Δημιουργία αντικειμένου: Στο Main() φτιάχνουμε ένα νέο αντικείμενο myCar από την κλάση Car και του δίνουμε ιδιότητες (χρώμα, μοντέλο, ταχύτητα).
  • Χρήση μεθόδων: Το αντικείμενο myCar μπορεί να εκτελεί τις μεθόδους Drive() (οδήγηση) και Brake() (φρενάρισμα).

Constructor (Κατασκευαστής):

Ένα constructor είναι μια ειδική μέθοδος που εκτελείται όταν δημιουργείται ένα αντικείμενο. Χρησιμοποιείται για να αρχικοποιήσει τις ιδιότητες του αντικειμένου με προκαθορισμένες τιμές.

Παράδειγμα με Constructor:

using System;

class Car
{
    // Ιδιότητες
    public string Color { get; set; }
    public string Model { get; set; }
    public int Speed { get; set; }

    // Constructor για αρχικοποίηση ιδιοτήτων
    public Car(string color, string model, int speed)
    {
        Color = color;
        Model = model;
        Speed = speed;
    }

    // Μέθοδος για οδήγηση
    public void Drive()
    {
        Console.WriteLine($"{Model} οδηγείται με ταχύτητα {Speed} χλμ/ώρα.");
    }

    // Μέθοδος για φρενάρισμα
    public void Brake()
    {
        Speed = 0;
        Console.WriteLine($"{Model} έχει σταματήσει.");
    }
}

class Program
{
    static void Main()
    {
        // Δημιουργία αντικειμένου με χρήση του Constructor
        Car myCar = new Car("Κόκκινο", "Toyota", 120);
        myCar.Drive();
        myCar.Brake();
    }
}

Τι προστέθηκε εδώ:

  • Ο constructor Car(string color, string model, int speed) αρχικοποιεί τις ιδιότητες του αντικειμένου κατά τη δημιουργία του. Τώρα όταν δημιουργούμε ένα νέο αυτοκίνητο, μπορούμε να του δώσουμε κατευθείαν τις ιδιότητες (χρώμα, μοντέλο, ταχύτητα).

Πολυμορφισμός (Polymorphism):

Ο πολυμορφισμός είναι μια σημαντική έννοια στον αντικειμενοστραφή προγραμματισμό, που επιτρέπει στα αντικείμενα να παίρνουν διαφορετικές μορφές. Δηλαδή, διάφορα αντικείμενα μπορούν να εκτελούν τις ίδιες μεθόδους, αλλά με διαφορετικό τρόπο.

Παράδειγμα Πολυμορφισμού:

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

using System;

class Car
{
    public string Model { get; set; }
    public virtual void Drive()  // Η virtual μέθοδος μπορεί να τροποποιηθεί από τις υποκλάσεις
    {
        Console.WriteLine($"{Model} οδηγείται.");
    }
}

class RaceCar : Car
{
    public override void Drive()  // Η μέθοδος Drive τροποποιείται για το αγωνιστικό αυτοκίνητο
    {
        Console.WriteLine($"{Model} οδηγείται πολύ γρήγορα!");
    }
}

class Program
{
    static void Main()
    {
        Car myCar = new Car { Model = "Toyota" };
        RaceCar myRaceCar = new RaceCar { Model = "Ferrari" };

        myCar.Drive();         // Εκτυπώνει: Toyota οδηγείται.
        myRaceCar.Drive();     // Εκτυπώνει: Ferrari οδηγείται πολύ γρήγορα!
    }
}

Τι συμβαίνει εδώ:

  • Η κλάση Car έχει τη μέθοδο Drive(), αλλά όταν φτιάχνουμε ένα αντικείμενο RaceCar (αγωνιστικό αυτοκίνητο), η μέθοδος Drive() λειτουργεί διαφορετικά, γιατί την έχουμε τροποποιήσει με τη λέξη-κλειδί override.

Κληρονομικότητα (Inheritance):

Η κληρονομικότητα είναι όταν μια κλάση “κληρονομεί” τις ιδιότητες και τις μεθόδους μιας άλλης κλάσης. Αυτό μας επιτρέπει να επαναχρησιμοποιούμε τον κώδικα και να δημιουργούμε πιο εξειδικευμένες κλάσεις.

Παράδειγμα Κληρονομικότητας:

using System;

class Vehicle  // Η κλάση Vehicle είναι η γενική κλάση (γονική κλάση)
{
    public string Brand { get; set; }
    public void Start()
    {
        Console.WriteLine($"{Brand} ξεκινά.");
    }
}

class Car : Vehicle  // Η κλάση Car κληρονομεί από την κλάση Vehicle
{
    public string Model { get; set; }
    public void Drive()
    {
        Console.WriteLine($"{Brand} {Model} οδηγείται.");
    }
}

class Program
{
    static void Main()
    {
        Car myCar = new Car();
        myCar.Brand = "Toyota";
        myCar.Model = "Corolla";

        myCar.Start();  // Χρησιμοποιεί τη μέθοδο της γονικής κλάσης
        myCar.Drive();  // Χρησιμοποιεί τη μέθοδο της δικής της κλάσης
    }
}

Τι βλέπουμε εδώ:

  • Η κλάση Vehicle είναι η γονική κλάση, που έχει τη μέθοδο Start(). Η κλάση Car κληρονομεί αυτή τη μέθοδο, αλλά προσθέτει και τη δική της μέθοδο Drive(). Το αντικείμενο myCar μπορεί να χρησιμοποιήσει τόσο τη μέθοδο της γονικής κλάσης όσο και της δικής του κλάσης.

Τελικές Συμβουλές:

  • Τα αντικείμενα είναι ζωντανές “περιπτώσεις” κλάσεων: Κάθε φορά που δημιουργείς ένα αντικείμενο, είναι σαν να φτιάχνεις ένα πραγματικό “αντίγραφο” της κλάσης με τα δικά του δεδομένα και συμπεριφορές.
  • Χρησιμοποίησε την κληρονομικότητα για να μειώσεις τον κώδικα που επαναλαμβάνεται: Η κληρονομικότητα είναι πολύ χρήσιμη όταν θέλεις να φτιάξεις κλάσεις που έχουν πολλά κοινά.
  • Ο πολυμορφισμός κάνει τον κώδικά σου πιο ευέλικτο: Σου επιτρέπει να φτιάχνεις κλάσεις που μπορούν να κάνουν το ίδιο πράγμα με διαφορετικούς τρόπους.

Ακολουθούν μερικά προτζεκτάκια για να εξασκηθείς στα αντικείμενα στην C#. Αυτά τα project θα σε βοηθήσουν να καταλάβεις καλύτερα πώς να δουλεύεις με κλάσεις, αντικείμενα, ιδιότητες, μεθόδους, κληρονομικότητα, και πολυμορφισμό.

1. Διαχείριση Βιβλιοθήκης

Περιγραφή: Φτιάξε ένα πρόγραμμα για να διαχειρίζεσαι μια μικρή βιβλιοθήκη. Θα έχεις κλάσεις για τα βιβλία και τα μέλη της βιβλιοθήκης, και θα μπορείς να δανείζεις και να επιστρέφεις βιβλία.

Οδηγίες:

  • Φτιάξε μια κλάση Book με ιδιότητες όπως Title, Author, ISBN, και IsAvailable.
  • Φτιάξε μια κλάση Member με ιδιότητες όπως Name, MemberID, και BooksBorrowed.
  • Φτιάξε μια μέθοδο BorrowBook(Book book) για να δανείζεις βιβλία στα μέλη.
  • Φτιάξε μια μέθοδο ReturnBook(Book book) για να επιστρέφουν τα βιβλία τα μέλη.

Επέκταση:

  • Πρόσθεσε κανόνες, όπως να μην μπορούν να δανειστούν πάνω από 3 βιβλία ταυτόχρονα.
  • Φτιάξε μια κλάση Librarian που να μπορεί να προσθέτει νέα βιβλία στη βιβλιοθήκη.

2. Διαχείριση Σχολείου

Περιγραφή: Φτιάξε ένα πρόγραμμα για τη διαχείριση μαθητών και καθηγητών σε ένα σχολείο.

Οδηγίες:

  • Φτιάξε μια κλάση Person με ιδιότητες όπως Name, Age, και ID.
  • Φτιάξε δύο υποκλάσεις: Student και Teacher, που θα κληρονομούν από την κλάση Person.
    • Η κλάση Student θα έχει επιπλέον ιδιότητες όπως Grade και Subjects.
    • Η κλάση Teacher θα έχει επιπλέον ιδιότητες όπως SubjectTaught και YearsOfExperience.
  • Φτιάξε μεθόδους όπως AddSubject(string subject) για τους μαθητές και TeachClass() για τους καθηγητές.

Επέκταση:

  • Πρόσθεσε μια μέθοδο CalculateAverageGrade() που θα υπολογίζει τον μέσο όρο βαθμολογίας για κάθε μαθητή.
  • Φτιάξε μια κλάση Classroom για να αποθηκεύεις τους μαθητές και τους καθηγητές που ανήκουν σε μια τάξη.

3. Διαχείριση Αυτοκινήτων σε Ενοικιαζόμενα Οχήματα

Περιγραφή: Φτιάξε ένα πρόγραμμα για να διαχειρίζεσαι αυτοκίνητα σε μια εταιρεία ενοικίασης οχημάτων.

Οδηγίες:

  • Φτιάξε μια κλάση Car με ιδιότητες όπως Make (μάρκα), Model, Year, και IsRented.
  • Φτιάξε μια κλάση Customer με ιδιότητες όπως Name, DriverLicenseNumber, και RentedCar.
  • Φτιάξε μια μέθοδο RentCar(Car car) που θα επιτρέπει στον πελάτη να νοικιάσει ένα αυτοκίνητο.
  • Φτιάξε μια μέθοδο ReturnCar() για να επιστρέφεται το αυτοκίνητο στην εταιρεία.

Επέκταση:

  • Πρόσθεσε περιορισμούς, όπως να μην μπορούν οι πελάτες να νοικιάσουν πάνω από ένα αυτοκίνητο ταυτόχρονα.
  • Φτιάξε μια κλάση Fleet για να διαχειρίζεσαι τον στόλο των διαθέσιμων αυτοκινήτων και την κατάστασή τους.

4. Παιχνίδι Ζώων

Περιγραφή: Φτιάξε ένα παιχνίδι όπου θα έχεις διάφορα ζώα, και το κάθε ζώο θα έχει διαφορετική συμπεριφορά όταν “μιλάει” (πολυμορφισμός).

Οδηγίες:

  • Φτιάξε μια κλάση Animal με ιδιότητες όπως Name και Age.
  • Φτιάξε υποκλάσεις για διαφορετικά ζώα, όπως Dog, Cat, και Bird.
  • Κάθε υποκλάση να έχει τη δική της μέθοδο Speak(), όπου το Dog θα γαβγίζει, η Cat θα νιαουρίζει, και το Bird θα κελαηδάει.

Επέκταση:

  • Φτιάξε μεθόδους όπως Eat() και Sleep() που να λειτουργούν διαφορετικά για κάθε ζώο.
  • Δημιούργησε έναν “Κτηνίατρο” που να μπορεί να εξετάσει όλα τα ζώα και να τους δίνει φάρμακα.

5. Διαχείριση Τραπεζικών Λογαριασμών

Περιγραφή: Φτιάξε ένα πρόγραμμα που διαχειρίζεται τραπεζικούς λογαριασμούς, καταθέσεις και αναλήψεις.

Οδηγίες:

  • Φτιάξε μια κλάση BankAccount με ιδιότητες όπως AccountNumber, Owner, και Balance.
  • Φτιάξε μεθόδους Deposit(decimal amount) και Withdraw(decimal amount) για να διαχειρίζεσαι καταθέσεις και αναλήψεις.
  • Φτιάξε μια μέθοδο CheckBalance() για να ελέγχεις το υπόλοιπο του λογαριασμού.

Επέκταση:

  • Πρόσθεσε υποκλάσεις SavingsAccount και CheckingAccount με επιπλέον χαρακτηριστικά, όπως τόκους για τους λογαριασμούς ταμιευτηρίου.
  • Φτιάξε μια μέθοδο TransferFunds(BankAccount toAccount, decimal amount) για να μεταφέρεις χρήματα μεταξύ λογαριασμών.

6. Διαχείριση Μαγαζιού Εστιατορίου

Περιγραφή: Φτιάξε ένα πρόγραμμα για να διαχειρίζεσαι ένα μενού και παραγγελίες σε ένα εστιατόριο.

Οδηγίες:

  • Φτιάξε μια κλάση MenuItem με ιδιότητες όπως Name, Price, και Category (π.χ. Κυρίως Πιάτο, Γλυκό).
  • Φτιάξε μια κλάση Order με ιδιότητες όπως TableNumber, Items, και TotalPrice.
  • Φτιάξε μεθόδους AddItem(MenuItem item) και RemoveItem(MenuItem item) για να προσθέτεις και να αφαιρείς πιάτα από την παραγγελία.

Επέκταση:

  • Φτιάξε μια κλάση Waiter για να διαχειρίζεται τις παραγγελίες και να υπολογίζει τον λογαριασμό για κάθε τραπέζι.
  • Πρόσθεσε λειτουργία για να προσδιορίζεις το αν οι παραγγελίες ολοκληρώθηκαν ή όχι.

7. Δημιουργία Παιχνιδιού Μάχης

Περιγραφή: Φτιάξε ένα παιχνίδι μάχης όπου οι παίκτες θα ελέγχουν διάφορους χαρακτήρες που θα μπορούν να επιτίθενται ο ένας στον άλλον.

Οδηγίες:

  • Φτιάξε μια κλάση Character με ιδιότητες όπως Name, Health, και AttackPower.
  • Φτιάξε μεθόδους Attack(Character enemy) και TakeDamage(int damage) για να γίνεται μάχη μεταξύ των χαρακτήρων.
  • Φτιάξε υποκλάσεις Warrior, Mage, και Archer, όπου κάθε κλάση να έχει διαφορετική επίθεση.

Επέκταση:

  • Πρόσθεσε ειδικές ικανότητες για κάθε χαρακτήρα (π.χ. ο μάγος να ρίχνει ξόρκια, ο πολεμιστής να έχει ισχυρή επίθεση).
  • Φτιάξε μια κλάση BattleArena όπου θα πραγματοποιούνται οι μάχες μεταξύ των χαρακτήρων.

8. Διαχείριση Συστήματος Εισιτηρίων Κινηματογράφου

Περιγραφή: Φτιάξε ένα σύστημα όπου οι χρήστες μπορούν να αγοράζουν εισιτήρια για ταινίες.

Οδηγίες:

  • Φτιάξε μια κλάση Movie με ιδιότητες όπως Title, Duration, και Rating.
  • Φτιάξε μια κλάση Ticket με ιδιότητες όπως SeatNumber, Price, και Movie.
  • Φτιάξε μεθόδους για να αγοράζεις εισιτήρια και να τα αποθηκεύεις σε μια λίστα.

Επέκταση:

  • Φτιάξε μια κλάση User που θα μπορεί να αγοράζει πολλά εισιτήρια.
  • Πρόσθεσε δυνατότητα για να υπολογίζεις την πληρότητα της αίθουσας και να αποφεύγεις την πώληση εισιτηρίων όταν οι θέσεις έχουν εξαντληθεί.