C# COMPLETE COURSE

image description

ΕΝΟΤΗΤΑ 13 - CREATING CLASSES, FIELDS AND OBJECTS

INTRODUCTION

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

HOW TO CREATE A CLASS

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

Αυτός ακριβώς είναι ο σκοπός της κλάσης – να μπορούμε να περιγράψουμε προγραμματιστικά αντικείμενα από το φυσικό κόσμο μέσα στο πρόγραμμα μας. Οπότε είναι απολύτως λογικό να ξεκινήσουμε με το να δημιουργήσουμε μια κλάση. Αυτή θα είναι μια επιπλέον δεύτερη κλάση εκτός από εκείνη που περιέχει την Main( ) μέθοδο. Συνήθως δημιουργούμε την κλάση σε ένα αρχείο και από ένα άλλο αρχείο δημιουργούμε αντικείμενα από αυτές.

Πριν ξεκινήσουμε να αναλύουμε γραμμή προς γραμμή την δημιουργία κλάσεων και fields, ας δημιουργήσουμε ένα καινούργιο project στο Visual Studio ( που μπορείτε να το ονομάσετε ClassAndFields) ακολουθώντας τα βήματα που ήδη γνωρίζετε. Όπως κάθε project, έτσι και αυτό περιέχει ήδη μια κλάση με το όνομα Program.cs μέσα στο οποίο υπάρχει η μέθοδο Main από την οποία ξεκινάει η εκτέλεση του προγράμματος μας.

Όπως αναφέραμε, δεν γράφουμε όλο τον κώδικα μιας εφαρμογής στο ίδιο αρχείο αλλά τον μοιράζουμε σε διαφορετικά αρχεία που αντιπροσωπεύουν κλάσεις. Για να δημιουργήσουμε μια καινούργια κλάση κάνουμε δεξί κλικ επάνω στο project και από το εμφανιζόμενο μενού επιλέγουμε Add και μετά class.

Δωρεάν Μαθήματα C#

Από τις εμφανιζόμενες επιλογές επιλέγουμε πάλι Class και ονομάζουμε το αρχείο μας Product. Για να προστεθεί το αρχείο στο υπάρχον project πατάμε το κουμπί Add.

Δωρεάν Μαθήματα C#

Δωρεάν Μαθήματα C#

Για να ανοίξουμε το αρχείο Product.cs (όπως και κάθε αρχείο στο Visual Studio) απλά κάνουμε κλικ επάνω στο όνομα του αρχείου. Για να καταλάβουμε καλύτερα την θεωρία θα διαγράψουμε όλα τα περιεχόμενα του αρχείου γιατί πολύ απλά αυτή τη στιγμή δεν τα χρειαζόμαστε και θα είναι πιο εύκολo για εμάς να κατανοήσουμε την θεωρία των κλάσεων. Διαγράφουμε όλα τα στοιχεία λοιπόν που περιέχονται μέσα στο αρχείο Product.cs.

Δωρεάν Μαθήματα C#

Για να δημιουργήσουμε μια κλάση πρέπει να πρώτα να γράψουμε τη λέξη κλειδί class και αμέσως μετά το όνομα που επιθυμούμε να ονομάσουμε την κλάση μας. Η λέξη class δηλώνει στη C# ότι θέλουμε να δηλώσουμε την δημιουργία μιας καινούργιας κλάσης που θα έχει την δυνατότητα να δημιουργεί αντικείμενα. Τέλος ανοίγουμε και κλείνουμε ένα ζευγάρι άγκιστρα μέσα στα οποία θα ορίσουμε τα fields της κλάσης. Στο δικό μας παράδειγμα θα ονομάσουμε την κλάση μας Product.

Δωρεάν Μαθήματα C#

Ο ορισμός της κλάσης ακόμα δεν έχει ολοκληρωθεί. Μπροστά από την λέξη class θα πρέπει να ορίσουμε το access modifier δηλώνοντας είτε την λέξη public είτε την λέξη internal. Η λέξη public δηλώνει ότι οποιαδήποτε άλλη κλάση από το ίδιο project ή διαφορετικό project μπορεί να έχει πρόσβαση στα στοιχεία της κλάσης, ενώ η λέξη internal δηλώνει ότι μόνο κλάσεις από το ίδιο project θα μπορούν να έχουν πρόσβαση στα στοιχεία της κλάσης. Στο δικό μας παράδειγμα θα δηλώσουμε τον access modifier να είναι public. Αυτό σημαίνει ότι αν στο solution που δημιουργήσαμε με ένα project αργότερα προσθέσουμε και ένα δεύτερο project, τότε αυτό θα έχει πρόσβαση στην κλάση μας και δεν θα χρειαστεί να δημιουργήσουμε μια δεύτερη κλάση με τον ίδιο κώδικα. Όταν αργότερα δούμε το πως μπορούμε να προσθέσουμε ένα δεύτερο project μέσα στο ίδιο solution τότε θα σας είναι απόλυτα κατανοητή αυτή η έννοια. Για τώρα απλά προσθέτουμε την λέξη public μπροστά από την λέξη class για να ολοκληρωθεί ο ορισμός της κλάσης.

Δωρεάν Μαθήματα C#

Αν δεν προσθέσουμε κανένα access modifier στη κλάση, αυτόματα η C# θεωρεί ότι ισχύει ο internal access modifier. Επίσης η γραμμή ορισμού της κλάσης μπορεί να περιέχει και άλλες λέξεις όπως static, abstract κτλ τις οποίες όμως θα αναλύσουμε σε μελλοντικά δωρεάν μαθήματα C#. Για τώρα μας αρκεί ο βασικός ορισμός της κλάσης.

CREATING FIELDS

Όπως ήδη έχουμε αναφέρει στο προηγούμενο δωρεάν μάθημα C#, μια κλάση είναι ο τρόπος να περιγράψουμε προγραμματιστικά ένα αντικείμενο από το φυσικό κόσμο. Για να περιγράψουμε τα χαρακτηριστικά του αντικειμένου δηλώνουμε μεταβλητές μέσα στην κλάση που ονομάζονται fields. Κάθε δήλωση ενός field περιέχει τον access modifier (που στο δικό μας παράδειγμα θα παραμείνει public), το data type της μεταβλητής και τέλος το όνομα της. Υπάρχουν και κάποιες άλλες προαιρετικές λέξεις που μπορούμε να προσθέσουμε αλλά θα τις δούμε σε μελλοντικά δωρεάν μαθήματα C#. Για τώρα θα παραμείνουμε στην απλή δήλωση των fields μέσα σε μια κλάση.

Θέλουμε λοιπόν να περιγράψουμε το αντικείμενο προϊόν προγραμματιστικά. Δεν αναφερόμαστε σε ένα συγκεκριμένο προϊόν (computer, mobile, κτλ) αλλά στα χαρακτηριστικά που έχουν όλα τα προϊόντα που πουλάμε.

Για αρχή γνωρίζουμε ότι κάθε προϊόν έχει ένα μοναδικό αριθμό τον οποίο χρησιμοποιούμε για να βρούμε το κάθε αντικείμενο στην αποθήκη. Μπορούμε να ονομάσουμε την μεταβλητή που περιγράφει αυτό το χαρακτηριστικό σαν productid και επειδή θα δέχεται ακέραιους αριθμούς θα έχει int σαν data type.

Κάθε προϊόν έχει ένα όνομα ή μια κατηγορία κάτω από την οποία ανήκει. Μπορούμε λοιπόν να ονομάσουμε αυτό το field productName με data type είδος string.

Μπορούμε επίσης να υποθέσουμε ότι κάθε προϊόν που πουλάμε έχει ένα κόστος το οποίο μπορούμε να αντιπροσωπεύσουμε με ένα field που έχει το όνομα cost και data type είδος double.

Τέλος, για να γνωρίζουμε πόσα προϊόντα έχουν μείνει στην αποθήκη έτσι ώστε να μπορούμε να ανταποκριθούμε στις απαιτήσεις των πελατών, ας δημιουργήσουμε ένα ακόμα field με το όνομα quantityInStock το οποίο θα δέχεται int τιμές.

Εννοείται ότι μπορείτε να προσθέσετε όσα ακόμα χαρακτηριστικά θεωρείτε ότι ίσως να είναι χρήσιμα στο συγκεκριμένο σενάριο. Στο δικό μας παράδειγμα θα χρησιμοποιήσουμε αυτά τα τέσσερα και αργότερα θα προσθέσουμε και άλλα. Ας δούμε τώρα πως έχει αλλάξει ο κώδικας της κλάσης Product.

Δωρεάν Μαθήματα C#

CREATING OBJECTS

Η κλάση Product είναι έτοιμη και με τα fields που ορίσαμε, μπορεί τώρα να περιγράψει ένα ή περισσότερα προϊόντα. Μην ξεχνάμε ότι αφού δημιουργήσουμε μια κλάση, το αμέσως επόμενο βήμα είναι να χρησιμοποιήσουμε την κλάση σαν καλούπι για να δημιουργήσουμε αντικείμενα είδος Product. Πως όμως δημιουργούμε αντικείμενα από μια κλάση?

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

Δωρεάν Μαθήματα C#

Είμαστε έτοιμοι λοιπόν για να δημιουργήσουμε το πρώτο μας προϊόν (αντικείμενο) από την κλάση Product. Για να το πραγματοποιήσουμε αυτό, θα πρέπει να γράψουμε την εξής εντολή:

Δωρεάν Μαθήματα C#

Ξέρω ότι η γραμμή αυτή του κώδικα σας προκαλεί αρκετά ερωτηματικά αλλά ας προσπαθήσουμε να την εξηγήσουμε με απλά λόγια. Ξεκινώντας από την δεξιά πλευρά του = συμβόλου.

Το statement new Product( ); δημιουργεί ένα αντικείμενο στην μνήμη του υπολογιστή. Αλλά πως;;;; H C#, από τη στιγμή που δημιουργήσαμε μια δική μας κλάση με μερικά fields, δημιούργησε για εμάς έναν μηχανισμό που ονομάζεται constructor με τον οποίο μπορούμε να δημιουργούμε αντικείμενα. Με άλλα λόγια, η C# μας λέει «ωραία, τώρα που δημιούργησες μια κλάση, θα σου προσθέσω και έναν constructor για να μπορείς να δημιουργείς αντικείμενα». Ο constructor έχει το ίδιο όνομα με την κλάση και για να τον καλέσουμε απλά γράφουμε την λέξη new και αμέσως μετά το όνομα του constructor που στο δικό μας παράδειγμα θα ονομάζεται Product. Η παρένθεση είναι μέρος της εντολής του constructor γιατί δηλώνει ότι μπορούμε στον constructor να περάσουμε και τιμές αν το επιθυμούμε. Θα φτάσουμε σε αυτό το σημείο αργότερα, αλλά για τώρα ας μείνουμε στην απλή σύνταξη ενός constructor.

Οπότε καταλάβαμε τώρα ότι το statement new Product( ); στην ουσία δίνει εντολή στον compiler της C# να δημιουργήσει ένα αντικείμενο. Το αντικείμενο αυτό δημιουργείτε σε μια περιοχή της μνήμης που ονομάζεται το Heap. Μέσα στο heap αποθηκεύονται όλα τα αντικείμενα της εφαρμογής με το κάθε ένα από αυτά να απασχολεί διαφορετική περιοχή στην μνήμη. Υπάρχει όμως ένα μεγάλο πρόβλημα εδώ – η C# σαν μοντέρνα γλώσσα προγραμματισμού έχει πλήρη έλεγχο των αντικειμένων συμπεριλαμβανομένων των διαδικασιών της δημιουργίας και της διαγραφής αντικειμένων από την μνήμη. Με άλλα λόγια από τη στιγμή που δημιουργήθηκε το αντικείμενο κανένας κώδικας δεν έχει απευθείας πρόσβαση στη μνήμη και στο αντικείμενο. Γλώσσες προγραμματισμού όπως C και C++ αφήνουν την ευθύνη διαχείρισης των αντικειμένων στον προγραμματιστή. Μοντέρνες γλώσσες προγραμματισμού όμως όπως η C#, η Java κτλ δεν επιτρέπουν την απευθείας πρόσβαση κώδικα στην διεύθυνση μνήμης που βρίσκεται το αντικείμενο. Οπότε πως λύνουμε αυτό το πρόβλημα;;;;

Η λύση είναι πάρα πολύ απλή. Η C# μας επιτρέπει να δημιουργήσουμε μια μεταβλητή που θα αναφέρεται εκείνη στο αντικείμενο. Οπότε όταν είναι ανάγκη να κάνουμε οποιαδήποτε ενέργεια με το αντικείμενο, εμείς θα καλούμε την μεταβλητή και εκείνη θα πηγαίνει και θα εκτελεί τις ενέργειες που επιθυμούμε. Αυτές οι μεταβλητές επειδή είναι τοπικές μεταβλητές που ορίζονται μέσα στη μέθοδο Main ορίζονται σε ένα άλλο σημείο της μνήμης που ονομάζεται το Stack.

Δωρεάν Μαθήματα C#

Το ρόλο δήλωσης της μεταβλητής ή reference variable όπως ονομάζεται το έχει αναλάβει ο ορισμός από τα αριστερά του = συμβόλου δηλαδή το statement Product product1.

Εδώ λοιπόν λέμε ότι θέλουμε να δημιουργήσουμε ένα reference με το όνομα product1 που θα είναι είδος Product και θα αναφέρεται στο αντικείμενο είδος Product που δημιουργήθηκε στο Heap. Το data type που δηλώνουμε στο reference product1 δηλώνει ότι το συγκεκριμένο reference θα αποκτήσει όλα τα χαρακτηριστικά και τις ιδιότητες της κλάση Product.

Πολλές φορές θα ακούτε τους senior προγραμματιστές να λένε «ας δημιουργήσουμε ένα αντικείμενο product1». Εκείνοι γνωρίζουν ήδη την διαφορά που μόλις αναφέραμε όμως για λόγους συντομίας αναφέρονται στο reference σαν να είναι αντικείμενο. Τώρα που και εσείς γνωρίζετε την διαφορά θα χρησιμοποιώ και εγώ την ίδια λογική για λόγους συντομίας.

Ωραία, οπότε δημιουργήσαμε ένα αντικείμενο product1. Ναι αλλά αυτό το product1 δεν περιέχει καμία πληροφορία για κανένα προϊόν. Πως δηλώνουμε λοιπόν ποια θα είναι τα στοιχεία και οι πληροφορίες που θα πλαισιώνουν το συγκεκριμένο αντικείμενο;

Εδώ δεν έχουμε παρά να καλέσουμε το όνομα του αντικειμένου product1 (επαναλαμβάνω και πάλι αυτό είναι reference στην πραγματικότητα) και αμέσως μετά γράφοντας τελεία να δούμε την λίστα με όλα τα χαρακτηριστικά που έχει κληρονομήσει από την κλάση Product το αντικείμενο μας. Για να δώσουμε τιμή σε κάθε ένα από αυτά τα χαρακτηριστικά δεν έχουμε παρά να καλέσουμε object.field = value και να τους αναθέσουμε τιμή.

Δωρεάν Μαθήματα C#

Αν θέλουμε να δείξουμε τις πληροφορίες που περιέχει το αντικείμενο μπορούμε να χρησιμοποιήσουμε Console.WriteLine statements όπως δείχνει ο παρακάτω κώδικας:

Δωρεάν Μαθήματα C#

Δωρεάν Μαθήματα C#

CREATING MORE OBJECTS

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

Δωρεάν Μαθήματα C#

Δωρεάν Μαθήματα C#

Δωρεάν Μαθήματα C#

Δωρεάν Μαθήματα C#

Δωρεάν Μαθήματα C#

ΕΙΣΗΓΗΤΗΣ

Merry Jhonson

Μιχάλης Κασάπογλου

Ο Μιχάλης Κασάπογλου, είναι ένας από τους πιο έμπειρους τεχνικούς εκπαιδευτές στον χώρο του προγραμματισμού με πάνω από 20 χρόνια εμπειρία. Έχει εργαστεί σαν IT Operations Manager, Senior Programmer, και Training Team Leader ενώ κατέχει και αρκετές πιστοποιήσεις που καλύπτουν ένα μεγάλο φάσμα τεχνολογιών στο προγραμματισμό, σε βάσεις δεδομένων και cloud. Στον ελεύθερο του χρόνο διατηρεί ένα τεχνολογικό blog στο οποίο θα βρείτε αρκετά δωρεάν μαθήματα προγραμματισμού για αρχάριους.

loader