Στην C#, ένα αντικείμενο είναι μια συγκεκριμένη περίπτωση (instance) μιας κλάσης, και είναι το θεμελιώδες συστατικό του αντικειμενοστραφούς προγραμματισμού (OOP). Ένα αντικείμενο μπορεί να θεωρηθεί ως ένα “πράγμα” το οποίο έχει δύο βασικά χαρακτηριστικά:
- Δεδομένα (Ιδιότητες / Properties): Τα αντικείμενα περιέχουν δεδομένα, τα οποία είναι αποθηκευμένα σε πεδία ή ιδιότητες. Για παράδειγμα, ένα αντικείμενο αυτοκινήτου μπορεί να έχει ιδιότητες όπως το χρώμα, το μοντέλο και η ταχύτητα.
- Συμπεριφορές (Μεθόδοι / 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
που περιγράφει τα βασικά χαρακτηριστικά ενός αυτοκινήτου, όπως το χρώμα, το μοντέλο, και την ταχύτητα. Μπορείς να φτιάξεις διαφορετικά αυτοκίνητα (αντικείμενα) με βάση αυτή την κλάση.
Ιδιότητες και Μέθοδοι
Ένα αντικείμενο έχει δύο βασικά στοιχεία:
- Ιδιότητες (Properties): Αυτές είναι τα χαρακτηριστικά ή τα δεδομένα που περιγράφουν το αντικείμενο. Στο παράδειγμα με το αυτοκίνητο, οι ιδιότητες μπορεί να είναι το χρώμα, το μοντέλο, και η ταχύτητα.
- Μέθοδοι (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
που θα μπορεί να αγοράζει πολλά εισιτήρια. - Πρόσθεσε δυνατότητα για να υπολογίζεις την πληρότητα της αίθουσας και να αποφεύγεις την πώληση εισιτηρίων όταν οι θέσεις έχουν εξαντληθεί.