Οι κλάσεις είναι μια κεντρική έννοια στον αντικειμενοστραφή προγραμματισμό. Στην Crystal, τα πάντα είναι αντικείμενα, κάθε αντικείμενο έχει έναν τύπο και μπορεί να ανταποκρίνεται σε κάποιες μεθόδους. Οι κλάσεις είναι πρότυπα για τη δημιουργία αντικειμένων, παρέχοντας αρχικές τιμές για την κατάσταση, όπως οι μεταβλητές, και υλοποιήσεις συμπεριφοράς, όπως οι μέθοδοι. Τα αντικείμενα είναι στιγμιότυπα κλάσεων που περιέχουν όλες τις μεταβλητές στιγμιοτύπου και τις καταστάσεις.
Μια κλάση ορίζεται με τη λέξη-κλειδί class, ακολουθούμενη από το όνομα της κλάσης γραμμένο σε UpperCamelCase.
class Account
end
Για να δημιουργήσεις ένα στιγμιότυπο μιας κλάσης, κάλεσε το όνομα της κλάσης χρησιμοποιώντας τη μέθοδο new.
class Account
end
account = Account.new
Στο παραπάνω παράδειγμα, η μεταβλητή account είναι ένα στιγμιότυπο της κλάσης Account.
Όταν δημιουργείς ένα στιγμιότυπο, μια ειδική μέθοδος που ονομάζεται initialize λειτουργεί ως κατασκευαστής.
Καλείται όταν δημιουργείται ένα στιγμιότυπο.
Ο κατασκευαστής σου επιτρέπει να ορίσεις την αρχική κατάσταση του στιγμιοτύπου.
Η μέθοδος initialize μπορεί να δεχτεί ορίσματα, τα οποία περνιούνται κατά τη δημιουργία ενός στιγμιοτύπου.
class Account
def initialize(number)
5 + number # => 9
end
end
Account.new(4)
Η μέθοδος initialize δεν μπορεί να επιστρέψει χειροκίνητα μια τιμή. Αντίθετα, η new επιστρέφει το νέο στιγμιότυπο που δημιουργήθηκε.
class Account
def initialize(number)
5 + number
end
end
Account.new(4)
# => #<Account:0x7f5dc33dcea0>
Μια μέθοδος στιγμιοτύπου είναι μια μέθοδος που είναι διαθέσιμη σε ένα στιγμιότυπο μιας κλάσης και μπορεί να κληθεί πάνω σε αυτό το στιγμιότυπο.
Οι μέθοδοι στιγμιοτύπου ορίζονται με τη λέξη-κλειδί def, ακολουθούμενη από το όνομα της μεθόδου.
Ορίζονται μέσα στον ορισμό της κλάσης.
class Account
def balance
100
end
end
account = Account.new
account.balance # => 100
Οι μεταβλητές στιγμιοτύπου είναι μεταβλητές που είναι διαθέσιμες σε όλες τις μεθόδους του στιγμιοτύπου.
Για να προσπελάσεις μια μεταβλητή στιγμιοτύπου, πρέπει να ορίσεις μια μέθοδο στιγμιοτύπου.
Μπορούν να αρχικοποιηθούν στη μέθοδο initialize.
Ορίζονται με το πρόθεμα @.
class Account
def initialize
@balance = 100
end
def balance
@balance
end
end
account = Account.new
account.balance
# => 100
Οι μεταβλητές στιγμιοτύπου μπορούν επίσης να οριστούν μέσα στον ορισμό της κλάσης.
class Account
@age = 0
end
Οι μεταβλητές στιγμιοτύπου μπορούν να αρχικοποιηθούν με ένα όρισμα που περνιέται στη μέθοδο initialize.
Επειδή η Crystal δεν μπορεί να συμπεράνει τον τύπο του ορίσματος που χρησιμοποιείται κατά την αρχικοποίηση, αυτός πρέπει να δηλώνεται.
Αν θέλεις να διαβάσεις περισσότερα για αυτό, μπορείς να δεις: συμπερασμός τύπων.
Για να δηλώσεις τον τύπο της μεταβλητής, μπορείς να χρησιμοποιήσεις το σύμβολο :, ακολουθούμενο από τον τύπο.
Για παράδειγμα, αν θέλεις να δημιουργήσεις μια μεταβλητή στιγμιοτύπου με όνομα balance τύπου Int32, μπορείς να κάνεις το εξής: @balance : Int32.
Ή, αν θέλεις να δημιουργήσεις μια μεταβλητή στιγμιοτύπου με όνομα raining τύπου Bool, μπορείς να κάνεις το εξής: @raining : Bool.
Υπάρχουν μερικοί τρόποι για να το υλοποιήσεις, είτε δηλώνοντας στη μέθοδο initialize το όρισμα με τον τύπο του και έπειτα αναθέτοντας τη μεταβλητή στιγμιοτύπου στο όρισμα, όπως στο παρακάτω παράδειγμα:
class Account
def initialize(balance : Int32)
@balance = balance
end
def balance
@balance
end
end
account = Account.new(1)
account_2 = Account.new(5)
account.balance
# => 1
account_2.balance
# => 5
Ένας άλλος τρόπος είναι να δηλώσεις τον τύπο της μεταβλητής στιγμιοτύπου στον ορισμό της κλάσης με τη μορφή: @<variable> : <Type>, όπως στο παρακάτω παράδειγμα:
class Weather
@raining : Bool
def initialize(raining)
@raining = raining
end
def raining
@raining
end
end
weather = Weather.new(true)
weather.raining
# => true
Οι μέθοδοι μπορούν να τροποποιούν μεταβλητές στιγμιοτύπου. Αυτές οι μέθοδοι μπορούν να κληθούν πάνω στο στιγμιότυπο της κλάσης. Όταν μια μέθοδος τροποποιεί μια μεταβλητή στιγμιοτύπου, αυτή η αλλαγή είναι διαθέσιμη μόνο στο στιγμιότυπο της κλάσης στο οποίο την κάλεσες.
class Account
def initialize(balance : Int32)
@balance = balance
end
def withdraw(amount)
@balance -= amount
end
def balance
@balance
end
end
account = Account.new(10)
account_2 = Account.new(10)
account.balance
# => 10
account_2.balance
# => 10
account.withdraw(5)
account.balance
# => 5
account_2.balance
# => 10
Οι μέθοδοι κλάσης είναι μέθοδοι που ορίζονται για μια κλάση αλλά όχι για τα στιγμιότυπά της.
Προσφέρουν έναν τρόπο να δημιουργείς μεθόδους που δεν εξαρτώνται από την κατάσταση του στιγμιοτύπου.
Ορίζονται με τη λέξη-κλειδί def, ακολουθούμενη από self.<method name>.
Το self είναι μια αναφορά στον χώρο ονομάτων από τον οποίο καλείται το self.
Σε αυτή την περίπτωση, αναφέρεται στην κλάση Account.
Θα ήταν το ίδιο σαν να είχες γράψει Account., αλλά το self. είναι ο προτιμότερος τρόπος.
class Account
def self.balance
100
end
end
Account.balance
# => 100
Ο φίλος σου ο Johannes λατρεύει να φτιάχνει μόνος του hardware (DIY, δηλαδή «φτιάξε το μόνος σου»). Μόλις έφτιαξε έναν αποχυμωτή και ο Johannes είναι πολύ ενθουσιασμένος με αυτόν. Ο στόχος του Johannes είναι να μπορεί να φτιάχνει φρέσκο χυμό κάθε πρωί.
Ο αποχυμωτής του Johannes έχει πολλά εντυπωσιακά χαρακτηριστικά. Όπως ένα ενσωματωμένο σύστημα μέτρησης, που μπορεί να σου πει πόσος χυμός υπάρχει στο ποτήρι. Έχει επίσης ένα χρονόμετρο, που σου λέει πόση ώρα λειτουργεί η μηχανή.
Ο Johannes δεν είναι ο καλύτερος στον προγραμματισμό, αλλά θέλει να φτιάξει ένα πρόγραμμα για να ελέγχει τη μηχανή. Γι' αυτό σου ζήτησε να τον βοηθήσεις.
Η μηχανή έχει μια λυχνία αποσφαλμάτωσης, είναι απλός μηχανισμός: αν η μηχανή έχει τροφοδοσία, η λυχνία αποσφαλμάτωσης είναι αναμμένη. Το πρόγραμμα θα τρέξει μόνο αν η λυχνία αποσφαλμάτωσης είναι αναμμένη.
Αυτή η μέθοδος πρέπει να είναι μια μέθοδος κλάσης με το όνομα JuiceMaker.
Όρισε τη μέθοδο κλάσης JuiceMaker.debug_light_on? που επιστρέφει true.
JuiceMaker.debug_light_on?
#=> true
Όταν η μηχανή παίρνει τροφοδοσία, θα πρέπει να δημιουργεί ένα στιγμιότυπο μιας κλάσης με το όνομα JuiceMaker.
Η μηχανή υποτίθεται ότι έχει μια αρχικοποιημένη κατάσταση.
Η αρχικοποιημένη κατάσταση πρέπει να κρατά τις εξής πληροφορίες:
false όταν η μηχανή ενεργοποιείται.Όρισε την αρχικοποιημένη κατάσταση, η οποία παίρνει ως παράμετρο την ποσότητα χυμού στο ποτήρι, και κατασκεύασε την αρχικοποιημένη κατάσταση.
Η αρχικοποιημένη κατάσταση πρέπει να περιέχει μια μεταβλητή στιγμιοτύπου @running που ορίζεται σε false, και μια μεταβλητή στιγμιοτύπου @fluid που βασίζεται σε ένα όρισμα που δίνεται όταν αρχικοποιείται η κλάση.
JuiceMaker.new(5)
#=> #<JuiceMaker:0x10f0b8 @running=false, @fluid=5>
Η μηχανή μπορεί να ενεργοποιηθεί και να απενεργοποιηθεί.
Πρέπει να ορίσεις μια μέθοδο για να ενεργοποιήσεις τη μηχανή.
Όταν η μηχανή ενεργοποιείται, η κατάσταση λειτουργίας πρέπει να οριστεί σε true.
Όρισε τη μέθοδο JuiceMaker#start που ενεργοποιεί τη μηχανή.
juice_maker = JuiceMaker.new(5)
juice_maker.start
juice_maker
#=> #<JuiceMaker:0x10f0b8 @running=true, @fluid=5>
Η μηχανή πρέπει να μπορεί να σου πει την κατάστασή της.
Πρέπει να επιστρέφει true αν η μηχανή λειτουργεί, και false αν η μηχανή δε λειτουργεί.
Όρισε τη μέθοδο JuiceMaker#running? που επιστρέφει την κατάσταση της μηχανής.
juice_maker = JuiceMaker.new(5)
juice_maker.start
juice_maker.running?
#=> true
Η μηχανή μπορεί να προσθέσει χυμό στο ποτήρι. Η μηχανή μπορεί να πει πόσος χυμός προστίθεται στο ποτήρι. Η μηχανή χρειάζεται βοήθεια για να ξέρει πόσος χυμός υπάρχει στο ποτήρι αφού προστεθεί ο χυμός.
Όρισε τη μέθοδο JuiceMaker#add_fluid, η οποία παίρνει ως παράμετρο την ποσότητα χυμού που προστίθεται και ενημερώνει την ποσότητα χυμού στο ποτήρι.
juice_maker = JuiceMaker.new(5)
juice_maker.add_fluid(5)
juice_maker
#=> #<JuiceMaker:0x10f0b8 @running=false, @fluid=10>
Η μηχανή μπορεί να ενεργοποιηθεί και να απενεργοποιηθεί.
Πρέπει να ορίσεις μια μέθοδο για να απενεργοποιήσεις τη μηχανή
Αυτή η μέθοδος θα καλείται μόνο όταν η μηχανή λειτουργεί.
Όταν η μηχανή απενεργοποιείται, η κατάσταση λειτουργίας πρέπει να οριστεί σε false.
Η μηχανή χρειάζεται επίσης βοήθεια για να προσδιορίσει πόσος χυμός υπάρχει στο ποτήρι αφού απενεργοποιηθεί.
Η μηχανή καταναλώνει πέντε μονάδες χυμού το λεπτό.
Όρισε τη μέθοδο JuiceMaker#stop που παίρνει ως παράμετρο τον αριθμό των λεπτών που λειτουργούσε η μηχανή και επιστρέφει την ποσότητα χυμού στο ποτήρι αφού απενεργοποιηθεί η μηχανή.
juice_maker = JuiceMaker.new(5)
juice_maker.start
juice_maker
#=> <JuiceMaker:0x10f0b8 @running=true, @fluid=5>
juice_maker.stop(1)
#=> #<JuiceMaker:0x10f0b8 @running=false, @fluid=0>
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Crystal με 26 έννοιες142 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.