Κληρονομικότητα

Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr

Εισαγωγή

Διάγραμμα κληρονομικότητας

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

Υπερφόρτωση

Παράδειγμα: σχήματα


class Shape {
    private int x, y;       // Position
    public void setPosition(int px, int py) {
        x = px;
        y = py;
    }

    @Override public String toString() {
        return "Shape(" + x + ", " + y + ")";
    }
}

class Circle extends Shape {
    private int radius;
    public void setRadius(int r) {
        radius = r;
    }

    @Override public String toString() {
        return super.toString() + ": Circle(" + radius + ")";
    }
}

class Rectangle extends Shape {
    private int height, width;

    public void setDimensions(int h, int w) {
        height = h;
        width = w;
    }

    @Override public String toString() {
        return super.toString() + ": Rectangle(" + height + " x " + width + ")";
    }
}

class Test1 {
    static public void main(String args[])
    {
        Circle c = new Circle();
        Rectangle r = new Rectangle();

        r.setPosition(1, 2);
        r.setDimensions(50, 50);
        c.setPosition(3, 4);
        c.setRadius(10);
        System.out.println(r);
        System.out.println(c);
    }
}

Σχήματα: διάγραμμα

Ο προσδιοριστής protected

Δυναμική διεκπεραίωση

Παράδειγμα δυναμικής διεκπεραίωσης

static public void main(String args[])
{
    Rectangle r = new Rectangle();
    Shape s;

    r.setPosition(1, 2);
    r.setDimensions(50, 50);
    s = r;
    s.setPosition(10, 20);
    System.out.println(r);
    System.out.println(s);
    r = (Rectangle)s;
}

Λειτουργία δυναμικής διεκπεραίωσης

Πλεονεκτήματα της δυναμικής διεκπεραίωσης

Σφραγισμένες κλάσεις

Με τους προσδιοριστές sealed και permits μπορούμε να ορίσουμε ποιες κλάσεις επιτρέπεται να επεκτείνουν τη μητρική κλάση.

public sealed class Shape permits Circle, Rectangle {
}

class Circle extends Shape {
}

class Rectangle extends Shape {
}

Αφηρημένες κλάσεις

Σχεδιάζοντας με αφηρημένες κλάσεις

Παράδειγμα: σχήματα

Σχήματα: ο κώδικας


abstract class Shape {
    private double x, y;        // Position
    protected double getX() { return x; }
    protected double getY() { return y; }
    public void setposition(double px, double py) {
        x = px;
        y = py;
    }
    public abstract double area();
    @Override public String toString() {
        return "Shape(x=" + x + ", y=" + y + ", area=" + area() + ")";
    }
}

class Circle extends Shape {
    private double radius;
    public void setradius(double r) {
        radius = r;
    }
    @Override public double area() {
        return Math.PI * radius * radius;
    }
    @Override public String toString() {
        return super.toString() + ": Circle(" + radius + ")";
    }
}

class Rectangle extends Shape {
    private double height, width;
    public void setdimensions(double h, double w) {
        height = h;
        width = w;
    }
    @Override public double area() {
        return height * width;
    }
    @Override public String toString() {
        return super.toString() + ": Rectangle(" + height + " x " + width + ")";
    }
}

class Test2 {
    static public void main(String args[])
    {
        Circle c = new Circle();
        Rectangle r = new Rectangle();
        Shape s[] = new Shape[2];

        s[0] = r;
        r.setposition(1, 2);
        r.setdimensions(50, 50);

        s[1] = c;
        c.setposition(3, 4);
        c.setradius(10);
        for (int i = 0; i < s.length; i++)
            System.out.println(s[i]);
    }
}
Το παραπάνω πρόγραμμα θα τυπώσει:
Shape(x=1.0, y=2.0, area=2500.0): Rectangle(50.0 x 50.0)
Shape(x=3.0, y=4.0, area=628.3185307179587): Circle(10.0)

Τελικές μεταβλητές

Τελικά ορίσματα

Δημόσιες τελικές μεταβλητές

Μια κλάση μπορεί να ορίσει δημόσιες σταθερές ιδιότητες ως μέλη για να μπορούν να χρησιμοποιηθούν από άλλες κλάσεις.
class PhysicalConstants {
    // Speed of light in vacuum (m/s)
    public static final double c = 299792458;
    // Permeability of vaccum (N/A/A)
    public static final double mu0 = 4 * Math.PI * 10e-7;
    // Newtonian constant of gravitation (m*m*m/kg/s/s)
    public static final double G = 6.67259e-11;
    // Planck constant (J*s)
    public static final double h = 6.6260755e-34;
    // Elementary charge (C)
    public static final double e = 1.60217733e-19;
}

Τελικές κλάσεις και μέθοδοι

Τελικές κλάσεις και μέθοδοι στην πράξη

Η ιεραρχία κλάσεων στη βιβλιοθήκη της Java

Java: παράσταση αριθμών-number

Number class UML diagram

Java: κλάσεις για το σχηματισμό μηνυμάτων

Format class UML diagram

Παράδειγμα χρήσης μηνυμάτων

 Object[] arguments = {
     Integer.valueOf(7),
     new Date(System.currentTimeMillis()),
     "a disturbance in the Force"
 };

 String result = MessageFormat.format(
     "At {1,time} on {1,date}, there was {2} on planet {0,number,integer}.",
     arguments);

Java: Τμήμα της ιεραρχίας Swing

Format class UML diagram

Άσκηση: κληρονομικότητα

Άσκηση 5

Μπορείτε να κατεβάσετε το αντίστοιχο αρχείο και να στείλετε τους βαθμούς σας από τους δεσμούς που βρίσκονται στη σελίδα των ασκήσεων.

Βιβλιογραφία

Περιεχόμενα