User Tools

Site Tools


java:inheritance

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
java:inheritance [2016/02/12 17:08]
gthanos [Final Κλάσεις και Μέθοδοι]
java:inheritance [2021/03/09 07:55]
gthanos
Line 1: Line 1:
 ====== Κληρονομικότητα ====== ====== Κληρονομικότητα ======
  
-Βασικό χαρακτηριστικό του αντικειμενοστραφούς προγραμματισμού είναι η δυνατότητα να παράγουμε νέες κλάσεις με βάση υφιστάμενες κλάσεις, εξειδικεύοντας και επεκτείνοντας τα χαρακτηριστικά των υφιστάμενων. Η διαδικασία επέκτασης των υφιστάμενων κλάσεων σε νέες ειδικότερες κλάσεις ονομάζεται κληρονομικότητα.+Βασικό χαρακτηριστικό του αντικειμενοστραφούς προγραμματισμού είναι η δυνατότητα να παράγουμε νέες κλάσεις με βάση υφιστάμενες, εξειδικεύοντας και επεκτείνοντας τα χαρακτηριστικά τους. Η διαδικασία επέκτασης των υφιστάμενων κλάσεων σε νέες ειδικότερες κλάσεις ονομάζεται κληρονομικότητα.
  
 Κάθε κλάση που κληρονομεί από μία άλλη κλάση ονομάζεται υποκλάση (//subclass//) της γονικής κλάσης από την οποία κληρονομεί. Αντίστοιχα, η γονική κλάση ονομάζεται υπερκλάση (//superclass//) της κληρονομούμενης κλάσης. Κάθε κλάση που κληρονομεί από μία άλλη κλάση ονομάζεται υποκλάση (//subclass//) της γονικής κλάσης από την οποία κληρονομεί. Αντίστοιχα, η γονική κλάση ονομάζεται υπερκλάση (//superclass//) της κληρονομούμενης κλάσης.
  
-{{  :java:super_sub_class.jpg  | }}+{{  :java:inheritance-1.png  | }}
  
-Όπως φαίνεται και στο παραπάνω σχήμα μία κλάση (//subclass//) μπορεί να κληρονομεί __**ΜΟΝΟ ΜΙΑ**__ άλλη κλάση. Αντίστροφα μία κλάση (//superclass//) μπορεί να κληρονομείται από πολλές διαφορετικές κλάσεις. Παρακάτω δίνουμε ένα παράδειγμα κληρονομικότητας από το site της [[https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html|Oracle]], όπου η κλάση ''MountainBike'' αποτελεί εξειδίκευση της κλάσης ''Bicycle''.+Όπως φαίνεται και στο παραπάνω σχήμα μία κλάση (//subclass//) μπορεί να κληρονομεί __**ΜΟΝΟ ΜΙΑ**__ άλλη κλάση. Αντίστροφα μία κλάση (//superclass//) μπορεί να κληρονομείται από πολλές διαφορετικές κλάσεις. Παρακάτω δίνουμε ένα παράδειγμα κληρονομικότητας ως συνέχεια των προηγούμενων ενοτήτων. Ορίζουμε την κλάση ''BasicRectangle'' η οποία αποτελεί το απλό ορθογώνιο παραλληλόγραμμο που γνωρίσαμε στην αρχή και την κλάση ''Rectangle'' που αποτελεί εξειδίκευση της κλάσης ''BasicRectangle'' ορίζοντας επιπλέον το πεδίο ''origin''.
  
-<code java Bicycle.java> +<code java BasicRectangle.java> 
-public class Bicycle { +class BasicRectangle {
-         +
-    private int cadence; +
-    private int gear; +
-    private int speed; +
-        +
-    public Bicycle(int startCadence, int startSpeed, int startGear) { +
-        gear = startGear; +
-        cadence = startCadence; +
-        speed = startSpeed; +
-    }+
          
-    public int getCadence() { +  int width; 
-          return cadence+  int height; 
-    }+  
 +  public BasicRectangle(int initWidth, int initHeight) { 
 +    width = initWidth
 +    height = initHeight; 
 +  } 
 + 
 +  void setWidth(int newWidth ) { 
 +    width = newWidth; 
 +  }
          
-    public int getGear() { +  void setHeight(int newHeight ) { 
-          return gear+    height = newHeight; 
-    }+  } 
 +   
 +  int getWidth() { 
 +    return width
 +  }
          
-    public int getSpeed() { +  int getHeight() { 
-          return speed+    return height; 
-    }+  } 
 +   
 +  int area() { 
 +    return width * height; 
 +  }
  
-    public void setCadence(int newValue) { 
-        cadence = newValue; 
-    } 
-         
-    public void setGear(int newValue) { 
-        gear = newValue; 
-    } 
-         
-    public void applyBrake(int decrement) { 
-        speed -= decrement; 
-    } 
-         
-    public void speedUp(int increment) { 
-        speed += increment; 
-    } 
-         
 } }
 </code> </code>
  
-<code java MountainBike.java> +<code java Point.java> 
-public class MountainBike extends Bicycle +class Point 
- +  int x;   // x coordinate 
-    private int seatHeight;+  int y;   // y coordinate 
 +   
 +  public Point(int xPos, int yPos) { 
 +    x = xPos; 
 +    y = yPos; 
 +  } 
 +   
 +  int getX() { 
 +    return x; 
 +  } 
 +   
 +  void setX(int xPos) { 
 +    x = xPos; 
 +  } 
 +   
 +  int getY() { 
 +    return y; 
 +  } 
 +   
 +  void setY(int yPos) { 
 +    y = yPos; 
 +  } 
 +   
 +  public String toString() { 
 +    return "("+x+","+y+")"; 
 +  } 
 +
 +</code>
  
-    // the MountainBike subclass has +<code java Rectangle.java> 
-    // one constructor +class Rectangle extends BasicRectangle{
-    public MountainBike(int startHeight, int startCadence, +
-                        int startSpeed, int startGear) { +
-        super(startCadence, startSpeed, startGear); +
-        seatHeight = startHeight; +
-    }    +
-         +
-    // the MountainBike subclass has +
-    // one method +
-    public void setHeight(int newValue) { +
-        seatHeight = newValue; +
-    }+
          
-    public int getSeatHeight() { +  Point origin; 
-        return seatHeight+     
-    }+  public Rectangle(int initWidth, int initHeight, Point initOrigin) { 
 +    super(initWidth, initHeight); 
 +    origin = initOrigin; 
 +  } 
 +   
 +  public Rectangle(int initWidth, int initHeight, int originX, int originY) { 
 +    super(initWidth, initHeight); 
 +    origin = new Point(originX,originY); 
 +  } 
 +     
 +  void setOrigin(Point newOrigin) { 
 +    origin = newOrigin; 
 +  } 
 +   
 +  Point getOrigin() { 
 +    return origin; 
 +  } 
 +    
 +  // Move rectangle origin by dx,dy 
 +  void moveOrigin(int dx, int dy) { 
 +    origin.setX( origin.getX() + dx ); 
 +    origin.setY( origin.getY() + dy ); 
 +  }
 } }
 </code> </code>
  
 +<WRAP tip 80% center round>
 +
 +=== Παρατηρήσεις ===
 +
 +  * Η κλάση //BasicRectangle// έχει τα πεδία //width, height//, ενώ η κλάση //Rectangle// διαθέτει τα πεδία αυτά και επιπλέον το πεδίο //origin//.
 +  * Βασικό χαρακτηριστικό της κληρονομικότητας είναι ότι η κληρονομούμενη κλάση έχει όλα τα  χαρακτηριστικά της γονικής κλάσης. Υπό αυτή την έννοια, τα αντικείμενα της κλάσης //Rectangle// είναι και του τύπου //BasicRectangle//.
 +  * Παρατηρήστε τη δεσμευμένη λέξη //super// ως πρώτη εντολή του κάθε κατασκευαστή. Μέσω της κλήσης //super// καλείται ο κατασκευαστής της γονικής κλάσης.
 +</WRAP>
 ===== Προσβασιμότητα των κληρονομούμενων πεδίων ===== ===== Προσβασιμότητα των κληρονομούμενων πεδίων =====
  
Line 92: Line 128:
   * Να χρησιμοποιήσουμε τα πεδία της γονικής κλάσης στα οποία έχουμε πρόσβαση (public, protected, package-private στο ίδιο package).   * Να χρησιμοποιήσουμε τα πεδία της γονικής κλάσης στα οποία έχουμε πρόσβαση (public, protected, package-private στο ίδιο package).
   * Να ορίσουμε νέα πεδία.   * Να ορίσουμε νέα πεδία.
-  * Να ορίσουμε νέα πεδία που να έχουν ίδιο όνομα με πεδία της γονικής κλάσης. Σε αυτή την περίπτωση "κρύβουμε" τα πεδία της γονικής κλάσης. Η συγκεκριμένη πρακτική δεν συνίσταται και παραπέμπει σε λανθασμένη σχεδίαση κώδικα. 
   * Να χρησιμοποιήσουμε τις μεθόδους της γονικής κλάσης στις οποίες έχουμε πρόσβαση (public, protected, package-private στο ίδιο package).   * Να χρησιμοποιήσουμε τις μεθόδους της γονικής κλάσης στις οποίες έχουμε πρόσβαση (public, protected, package-private στο ίδιο package).
   * Μπορούμε να γράψουμε νέες στατικές ή μη στατικές μεθόδους για τη υποκλάση.   * Μπορούμε να γράψουμε νέες στατικές ή μη στατικές μεθόδους για τη υποκλάση.
Line 99: Line 134:
   * Μπορούμε να γράψουμε κατασκευαστές της υποκλάσης που χρησιμοποιούν κατασκευαστές της γονικής κλάσης.   * Μπορούμε να γράψουμε κατασκευαστές της υποκλάσης που χρησιμοποιούν κατασκευαστές της γονικής κλάσης.
  
 +===== ΔΕΝ συνιστάται να κάνουμε σε μία υποκλάση... =====
 +  * Να ορίσουμε νέα πεδία που να έχουν ίδιο όνομα με πεδία της γονικής κλάσης. Σε αυτή την περίπτωση "κρύβουμε" τα πεδία της γονικής κλάσης. Η συγκεκριμένη πρακτική δεν συνίσταται και παραπέμπει σε λανθασμένη σχεδίαση κώδικα.
  
 +|Προηγούμενο: [[ :java:access_modifiers | Περιοριστές Πρόσβασης ]] | Επόμενο: [[ :java:type_casting | Ρητές (explicit) και άρρητες (implicit) μετατροπές τύπων ]]|
  
java/inheritance.txt · Last modified: 2022/03/11 05:21 by gthanos