Také je možné celou Kružnici dělat jako potomka Bodu, ale to asi není co potřebuješ.
To rozhodně není dobrý nápad, viz
http://en.wikipedia.org/wiki/Circle-ellipse_problemCelkově nevím, co vymýšlíte za složitosti:
interface Point {
int x();
int y();
}
interface Circle {
int radius();
Point centre();
}
class DefaultCircle implements Circle {
private final int radius;
private final Point centre;
public DefaultCircle(int radius, Point centre) {
this.point = point;
this.centre = centre;
}
public int radius() {
return radius;
}
public Point centre() {
return centre;
}
}
OCP je jenom o tom, že použitím abstraktních typů (ať už abstraktních tříd, interfaců, traitů nebo whatever) mám mezi objekty volné vazby jen přes jejich API (tzn. jejich veřejné metody), díky čemuž můžu vesele měnit implementaci (ať už jenom úpravou dané implementační třídy nebo záměnou za úplně jinou třídu implementující stejný interface), aniž bych musel překopávat klientské třídy (jiné třídy, které s danou třídou pracují). To ovšem má jednu podmínku a to, že API interfaců se nemůže měnit nekompatibilním způsobem (nemůžu smazat nebo upravit metodu). To je ta "closed for modification" část OCP.
Na druhou stranu, tahle abstrakce mi umožňuje dané interfacy vesele rozšiřovat, např. interface ColoredCircle extends Circle, který bude mít navíc třeba metodu vracející barvu kružnice. Takováhle rozšiřující změna nijak nerozbije klientský kód.