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

Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
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)

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

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

Τελικά πεδία