ΓΕΝΙΚΟ ΛΥΚΕΙΟ ΚΑΡΠΕΝΗΣΙΟΥ

(Γ) Ανάπτυξη Εφαρμογών

εβδ 27

Ύλη - Στόχοι

Κλάσεις - Πρόγονοι - Απόγονοι, Πολυμορφισμός

Βιβλίο 2: 4.4, 4.5, 4.6

Άσκηση kotlin 2 - Κληρονομικότητα

Όπως και πρίν άνοιξε την σελίδα play.kotlinlang.org.

Θα επεκτείνουμε τον προηγούμενο κώδικα έτσι ώστε ο επαγγελματίας (Professional) θα είναι απόγονος ενός ατόμου (Person). Ο επαγγελματίας έχει μια επιπλέον ιδιότητα ΑΦΜ και μια μέθοδο displayAfm.

Αντέγραψε τον κώδικα και δοκίμασε:
- Να προσθέσεις μια νέα ιδιότητα Τηλέφωνο (phoneNumber:String) στον επαγγελματία
- Να φτιάξεις μια νέα κλάση Πελάτης (Customer) η οποία θα είναι απόγονος(υποκλάση) του Ατόμου (Person) και θα έχει μια νέα ιδιότητα Διεύθυνση (address:String)
- Να φτιάξεις μια νέα κλάση Ανθοπώλης (Florist) η οποία θα είναι απόγονος(υποκλάση) του Επαγγελματία (Professional) και θα έχει μια νέα ιδιότητα Τραπεζικός λογαριασμός (bankAccount:String) ΠΡΟΣΟΧΗ! Στην kotlin, η κλαση Professional για να μπορεί να είναι πρόγονος(υπερκλάση) και να έχει απογόνους πρέπει να έχει επιπλέον την ένδειξη open.
- Δοκίμασε να βάλεις μεθόδους π.χ. displayAddress() στον πελάτη και να εμφανίζει την διεύθυνση
- Δες τον κώδικα στο "Τελική άσκηση κληρονομικότητας" για μερικά από αυτά που σου ζήτησα και ακόμα περισσότερα.
Κάνε κλίκ στον κώδικα για αντιγραφή
fun main() {
 var aProfessional = Professional("John", "Doe", "123456789")
 aProfessional.sayHi()
 aProfessional.displayAfm()
}

open class Person(var name:String, var lastname:String) {
 fun sayHi() {
  println("Hi my name is " + name)
 }
}

class Professional(aName:String, aLastname:String, var afm:String):Person(aName, aLastname) {
 fun displayAfm() {
  println("My afm is: " + afm)
 }
}

Άσκηση kotlin 3 - Σχήματα (σελ. 101)

Έχοντας ώς παράδειγμα την προηγούμενη άσκηση με τους επαγγελματίες επισκέψου το play.kotlinlang.org και φτιάξε κλάσεις με τους απογόνους τους σύμφωνα με το σχήμα 4.11 (σελ. 101) του βιβλίου.

ΠΡΟΣΟΧΗ!
- Οι ιδιότητες Ύψος, Βάση κτλ είναι όλες τύπου Float (πραγματικές) εσύ όμως χρησιμοποίησε ακέραιες (Int). Άν επιμένεις να γνωρίζεις :) πως χρησιμοποιούμε float στην kotlin δες την λύση της άσκησης 5.
- Στην κλάση Γεωμετρικό Σχήμα μην κάνεις την μέθοδο ΥπολογισμόςΕμβαδού.
- Στις κλάσεις απογόνους η μέθοδος ΥπολογισμόςΕμβαδου() ενώ έχει ίδιο όνομα κάνει διαφορετικούς υπολογισμούς σε κάθε απόγονο. Αυτό αποτυπώνεται στην θεωρία ως Πολυμορφισμός στο βιβλίο 2, κεφ. 4.5 (σελ. 105-108).

Τελική άσκηση κληρονομικότητας

Αυτή η άσκηση θα παρουσιαστεί στην τάξη. Είναι μια προσομοίωση ενός σεναρίου Πελάτης - Πωλητής και δείχνει επιπλέον πώς συνδέονται τα αντικείμενα μεταξύ τους (makeOrder - acceptOrder).

Αντέγραψε τον κώδικα και δοκίμασέ τον στο play.kotlinlang.org.
Κάνε κλίκ στον κώδικα για αντιγραφή
fun main() {
 var aProfessional = Professional("John", "Doe", "12345678")
 var aCustomer = Customer("Mary","Smith","30, London Str.")
 var anotherCustomer = Customer("Nick","Johnson","50, Paris Str.")
 aCustomer.makeOrder(aProfessional, "Flowers")
 aCustomer.makeOrder(aProfessional, "Laptop")
 anotherCustomer.makeOrder(aProfessional, "Table")

 aProfessional.sayHi()
 aProfessional.displayAfm()
 aProfessional.displayOrders()
}

open class Person(var name:String, var lastname:String) {
 fun sayHi() {
  println("Hi my name is " + name)
 }
}

class Professional(aName:String, aLastname:String, var afm:String):Person(aName, aLastname) {
 var orders:ArrayList<Order> = ArrayList()

 fun displayAfm() {
  println("My afm is: " + afm)
 }

 fun acceptOrder(anOrder:Order) {
  orders.add(anOrder)
  println("It's me " + name + ". I have just accepted an order titled: " + anOrder.title + " for customer " + anOrder.customer.name + " to deliver at address:" + anOrder.customer.address)
 }

 fun displayOrders() {
  println("These are my orders")
  for(nextOrder in orders)
   nextOrder.status()
 }
}

class Customer(aName:String, aLastname:String, var address:String):Person(aName, aLastname) {
 fun makeOrder(aProfessional:Professional, orderTitle:String) {
  val anOrder = Order(this, orderTitle)
  aProfessional.acceptOrder(anOrder)
 }
}

class Order(var customer:Customer, var title:String) {
 fun status() {
  println("This order was made by " + customer.name + " with title " + title)
 }
}

Άσκηση kotlin 4 - Πολυμορφισμός (σελ. 108)

Στο βιβλίο υπάρχει παράδειγμα πολυμορφισμού με γάτα και σκύλο (βιβλίο 2, σελ 108) δες πως υλοποιείται σε kotlin:
Κάνε κλίκ στον κώδικα για αντιγραφή
fun main() {
 var anAnimal = Dog("Max")
 var anotherAnimal = Cat("Kitty")
 
 /* Εδώ κάνω λίστα τύπου Animal (όχι Dog ή Cat) και προσθέτω τα animals που έφτιαξα */
 var animals:ArrayList<Animal> = ArrayList()
 animals.add(anAnimal)
 animals.add(anotherAnimal)
 
 /* Όταν κάνω επανάληψη στην λίστα με ΓΙΑ (for) το makeSound παρότι είναι αφαιρετική
  * ιδιότητα του animal και δεν έχει εντολές (abstract), αποκτά τις εντολές των προγόνων του.
  * Στην περίπτωση του σκύλου κάνει διαφορετικό ήχο από την γάτα */
 for (nextAnimal in animals)
  nextAnimal.makeSound()
}

/* Αφαιρετικότητα: Η κλάση Animal δηλώνει αφαιρετικά (abstract) ότι έχει όνομα και κάνει ήχο */
abstract class Animal(var name:String) {
 abstract fun makeSound()
}

/* Πολυμορφισμός: Η κλάση Dog κάνει διαφορετικό ήχο (makeSound) από την κλάση Cat */
class Dog(aName:String):Animal(aName) {
 override fun makeSound() {
  println(name + ": Γουφ!")
 }
}

class Cat(aName:String):Animal(aName) {
 override fun makeSound() {
  println(name + ": Νιάου!")
 }
}

Άσκηση kotlin 5 - Σχήματα με Πολυμορφισμό

Δύσκολη: Μπορείς να βελτιώσεις την άσκηση "kotlin 3 - Σχήματα" χρησιμοποιώντας Πολυμορφισμό και αφαιρετικότητα (abstract) όπως γίνεται στην Άσκηση 4;

ΠΡΟΣΟΧΗ, αν δεν έχεις καταλάβει την άσκηση 4 μην επιχειρείς καθόλου ;)

Λύση άσκησης 5

Κάνε κλίκ στον κώδικα για αντιγραφή
fun main() {
 var shapes:ArrayList<Shape> = ArrayList()
 shapes.add(Triangle(10.5f,20f))
 shapes.add(Rectangle(10f,20f))
 shapes.add(Circle(5f))
 
 for (nextShape in shapes)
  nextShape.calcArea()
}

abstract class Shape(var x:Float = 0f, var y:Float = 0f) {
 abstract fun calcArea()
}

class Rectangle(var width:Float, var height:Float):Shape() {
 override fun calcArea() {
  println(width*height)
 }
}

class Circle(var radius:Float):Shape() {
 override fun calcArea() {
  println(3.14f*radius*radius)
 }
}

class Triangle(var base:Float, var height:Float):Shape() {
 override fun calcArea() {
  println(base*height/2)
 }
}
εβδ 27