Υποκλάση (subclass)

Γενικές αρχές για υποκλάσεις και κληρονομικότητα

  • Μια κλάση που παράγεται από μια άλλη κλάση καλείται υποκλάση (subclass) ή παραγόμενη κλάση (derived) ή θυγατρική κλάση (child).
  • Η κλάση από την οποία παράγεται μια κλάση λέγεται υπερκλάση (superclass) ή γονική κλάση (parent) ή βασική κλάση (base).
  • Μια υποκλάση έχει τα δικά της πεδία, μεθόδους και κατασκευαστές όπως κάθε άλλη κλάση.
  • Μια υποκλάση κληρονομεί (inherit) τις public και protected μεθόδους και πεδία της υπερκλάσης αλλά όχι τους κατασκευαστές, μπορεί όμως να έχει πρόσβαση σε αυτούς.
  • Μια υποκλάση για να έχει πρόσβαση στα private μέλη της υπερκλάσης χρησιμοποιεί τις public μεθόδους της υπερκλάσης.
  • Για να δηλώσουμε ότι μια κλάση, έστω Manager είναι υποκλάση ή κληρονομεί την κλάση έστω Employee, γράφουμε: class Manager extends Employee
  • Μια κλάση μπορεί να κληρονομεί μόνο μία άλλη κλάση (δεν ισχύει η πολυκληρονομικότητα).
  • Μια κλάση μπορεί να κληρονομεί μια κλάση η οποία μπορεί να κληρονομεί μια άλλη κλάση ... κ.λπ.
  • Αν μια κλάση δεν κληρονομεί καμία άλλη κλάση, τότε αυτόματα θεωρείται ότι κληρονομεί την κλάση Object η οποία είναι η "μητρική" κλάση από την οποία κληρονομούν όλες οι άλλες.
    Για παράδειγμα η έκφραση: class MyClass σημαίνει
    class MyClass extends Object

Γενικό παράδειγμα

class Person // η υπερκλάση
{
    private String firstName;
    private String lastName;

    public Person(String fn, String ln) //constructor with parameters
    {
        firstName=fn;
        lastName=ln;
    }
    
    public Person() //constructor with no parameters
    {
        firstName="";
        lastName="";
    }
    
    public String getFirstName() //public method, returns string
    {
        return firstName;
    }
    
    public String getLastName() //public method, returns string
    {
        return lastName;
    }        

    public void setFirstName(String fn) //public method, sets firstName
    {
        firstName=fn;
    }
    
    public void setLastName(String ln) //public setter method, sets lastName
    {
        lastName=ln;
    }
}

class Student extends Person //η Student κληρονομεί την Person
{
    private int am; 

    public Student(String fn, String ln, int a) //κατασκευαστής της Student
    {
        setFirstName(fn); //καλεί την κληρονομημένη μέθοδο setFirstName της υπερκλάσης
        setLastName(ln); //καλεί την κληρονομημένη μέθοδο setLastName της υπερκλάσης
        am=a;     
    }

    public void setAm(int a) //public setter method, sets am
    {
        am=a;
    }

    public int getAm() //public method, returns am
    {
        return am;
    }
}

UML Διάγραμμα για κλάση και υποκλάση

Στα uml διαγράμματα μια κλάση έστω Β που κάνει extend μια κλάση έστω Α απεικονίζεται όπως παρακάτω: