Διεπαφή (interface)

Γενικές αρχές για διεπαφές

Μια διεπαφή είναι μια "κλάση" που περιέχει αποκλειστικά υπογραφές μεθόδων ή αν προτιμάτε abstract μεθόδους.
Υπογραφή μεθόδου (method signature) λέγεται η μέθοδος που δεν περιέχει σώμα (ούτε άγκιστρα). Για παράδειγμα:

double getArea(double width, double height);

Μια διεπαφή δηλώνεται με τον προσδιοριστή interface. Για παράδειγμα:

public interface Car {
	int turn(double radius, double startSpeed, double endSpeed);
	...
}

Μια διεπαφή μπορεί να περιέχει μεταβλητές οι οποίες είναι υποχρεωτικά public, static και final.

Δεν μπορούμε να δημιουργήσουμε αντικείμενα από μια διεπαφή.

Μια διεπαφή μπορεί να κάνει extend μία ή περισσότερες διεπαφές (πολυκληρονομικότητα).

Μια κλάση μπορεί να κάνει implement (υλοποίηση) μία ή περισσότερες διεπαφές. Για παράδειγμα:

public class Rec implements Shape
{
	double getArea(double width, double height)
	{
		//υλοποίηση
	}
}

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

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

interface Shape {
	double getWidth();
	double getHeight();
	void setWidth(double w);
	void setHeight(double h);
	double getArea();
}

class Rectangle implements Shape {
    
	private double width=0, height=0;

	@Override
	public double getWidth() {
		return width;
	}

	@Override
	public double getHeight() {
		return height;
	}

	@Override
	public void setWidth(double w) {
		width=w;
	}

	@Override
	public void setHeight(double h) {
		height=h;
	}

	@Override
	public double getArea() {
		return width*height;
	}

        //Δημιουργός που θέτει αρχικές τιμές 0 και 0 σε πλάτος και ύψος
        Rectangle() {
            width = 0;
            height = 0;
        }

        //Δημιουργός που θέτει αρχικές τιμές w και h σε πλάτος και ύψος
        Rectangle(double w, double h) {
            width = w;
            height = h;
        }
}

public class Main {
    public static void main(String[] args) {

        //Δημιουργώ το αντικείμενο έστω rec1 με τον πρώτο δημιουργό
        Rectangle rec1 = new Rectangle();

        //Δημιουργώ το αντικείμενο έστω rec2 με τον δεύτερο δημιουργό
        Rectangle rec2 = new Rectangle(2.6, 3.5);

        //κάνω σετ τις διαστάσεις του rec1
        rec1.setWidth(2.5);
        rec1.setHeight(3.7);

        //διαβάζω το εμβαδόν του rec1
        double a1 = rec1.getArea();

        //διαβάζω το εμβαδόν του rec2
        double a2 = rec2.getArea();

        //συγκρίνω τα δύο εμβαδά και εκτυπώνω μήνυμα
        if(a1>a2) {
            System.out.println("το πρώτο ορθογώνιο είναι μαγαλύτερο από το δεύτερο");
        } else if(a1<a2) {
            System.out.println("το πρώτο ορθογώνιο είναι μικρότερο από το δεύτερο");
        } else {
            System.out.println("τα εμβαδά των δύο ορθογωνίων είναι ίσα");
        }
    }
}

UML Διάγραμμα για διεπαφή

Στα uml διαγράμματα η διεπαφή απεικονίζεται όπως παρακάτω: