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

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

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

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

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

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

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

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

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 2 * 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 Test {
    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

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

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

Περιεχόμενα