Java Einfache Flächenberechnung MIT interface machen -.-

Zeboo

Lt. Commander
Registriert
Juli 2008
Beiträge
1.562
Hallo,

also vorne weg: Java + normale Klassen kann ich gut genug glaube ich, aber ich arbeite so gut wie gar nicht mit interfaces. Egal wie oft ich Sachen darüber lesen, ich finde kaum verwendung für diesen mist. Jetzt MUSS ich eins verwenden. Eine einfach Berechnung von Flächen soll stattfinden (vom Kreis, Quadrat ...). Dazu soll man interface(s) sinnvoll einsetzen. Huh? Wie denn das... also ich habe mir das so vorgestellt, aber weiß nicht wirklich ob das so Sinn macht:

PHP:
public interface Geometrie{

	double flaecheQuadrat(double a);
	double flaecheRechteck(double a, double b);
	double flaecheKreis(double p, double r);
}

PHP:
public class Rechnung implements Geometrie{

	public static void main(String[] args) {
		
		Rechnung r1 = new Rechnung();
		r1.flaecheKreis(0, 5);
		//und so weiter
	}
	
	@Override
	public double flaecheQuadrat(double a) {
		a = a*a;
		return a;
	}
	
	@Override
	public double flaecheRechteck(double a, double b) {
		a = a*b;
		return a;
	}
	
	@Override
	public double flaecheKreis(double pi, double r) {
		pi = 3.14;
		r = (r*r)*pi;
		return r;
	}
}

Ich kann echt nicht mit interfaces umgehen. Und ich habe echt viel dazu angeguckt ^^, ich weiß also nicht ob das so ok ist ober man das ganz anders machen sollte(?). Vllt kann noch jemand dazu ein, zwei sinnvolle interface-codes posten wo man Sinn der Sache erkennt.

Vielen Dank

Gruß
 
Hi,

ich denke es soll eher sowas werden

PHP:
public interface Geometrie {
    double Flaeche();
}

und dann z.B.

PHP:
public class Kreis implements Geometrie{ 

   ...

   // Implementiert Flaeche von Interface Geometrie
   public double Flaeche() {
      // Flächenberechnung für einen Kreis
   }

   ...
}

Bin mir nicht sicher ob der Java-Syntax so stimmt, aber das findest du ja bestimmt raus.
 
Hi,

ja aber für mich macht so ein Interface hier nicht so viel Sinn. Wozu ist das gut? Das zwingt einem sobald man das implementiert eine Funktion aus zu schreiben. Also hier die Fläche zu berechnen. Das geht auch ohne Interface prima und man muss auch gar nicht viel rumschreiben, geschweige noch eine extra Schnittstelle dafür schreiben. :freak:
 
Dann versuch du mal eine Klasse Kreis mit der Klasse Quadrat ohne Interfaces effektiv zu vergleichen.
So kannst du nun auch das Interface an eine Methode uebergeben, bspw. public void getSize(Geometrie g) { return g.Flaeche(); } und dann ein beliebiges Objekt der Geometrie uebergeben.

Wenn du mit Java arbeitest solltest du vielleicht zunaechsteinmal Objektorientierung lernen, bzw. verstehen.

Ich hab hier beispielsweise ein kleines 2D Spiel gecoded und hab ein Interface fuer Geometrieobjekt. Haette ich das nicht, koennte ich nicht Spieler + Geschoss + Wand in einer einzigen Methode auf Kollision vergleichen. So siehts ungefaehr aus:
Code:
    public boolean pruefeKollision(SpielObjekt o) {
        boolean ret = false;
        if(!o.equals(spieler[0]) && o.gibNummer()!=0) ret= o.kollidiert(spieler[0]);
        if(!o.equals(spieler[1]) && o.gibNummer()!=1) ret= o.kollidiert(spieler[1]);
        if(!ret) {
            for(int i =0;i<waende.size()&&ret==false;i++) {
                ret = o.kollidiert(waende.get(i));
            }
        }
        return ret;
    }
Kannst mir aber gerne zeigen wie du das ohne SpielObjekt als Interface machen willst :D
 
Zuletzt bearbeitet:
nehmen wir an du hasst eine Liste von Geometrischen Figuren (Kreis, Dreieck, Viereck...)
wenn du das jetzt ohne Interface machst musst immer überprüfen, ob das Element welches du aus der Liste gelesen hast, von einem bestimmten Typ ist...
PHP:
List figuren = getGeometrischeFigur();
for (int i=0; i < figuren.size(); i++) {
	if (figuren.get(i) instanceof Kreis) {
		((Kreis) figuren.get(i)).berechneKreisfläche();
	} else if... [auf jede Figur überprüfen...]
}

wenn du das ganze mit einem Interface machst, musst du nicht wissen welche Figuren in der Liste sind...
PHP:
List figuren = getGeometrischeFigur();
for (int i=0; i < figuren.size(); i++) {
	((GeometrischeFigur) figuren.get(i)).berechneFlaeche();
}

...so hoffe konnte helfen...
gruss, krizi...
 
Zeboo schrieb:
Hi,

ja aber für mich macht so ein Interface hier nicht so viel Sinn. Wozu ist das gut? Das zwingt einem sobald man das implementiert eine Funktion aus zu schreiben. Also hier die Fläche zu berechnen. Das geht auch ohne Interface prima und man muss auch gar nicht viel rumschreiben, geschweige noch eine extra Schnittstelle dafür schreiben. :freak:


Du hast scheinbar den Sinn von Interfaces noch nicht verstanden, daher solltest du noch mehr darüber lesen. Z.B. kannst du auf dieser Seite http://www.mindview.net/Books/TIJ/ das tolle Buch Thinking in Java als eBook downloaden. Ist zwar auf englisch, aber dennoch leicht lesbar.

Interfaces sind sehr wichtig für nen guten OO-Entwurf. Stichwort Komposition!
 
Interfaces bieten den kleinste gemeinsamen Nenner zwischen zwei Klassen.
In anderen Sprachen gibt es sogar Mehrfachvereerbung was gerade in Bezug aufs z.B Observer oder SingalSlot-Pattern sehr sinnvoll sein kann. Du könntest dein Interface hier z.b benutzen um ein Grafik Kompositum zu erstellen oder berechnen, oft werden Render-Trees so aufgebaut.
PHP:
public interface Grafik {
void add(Grafik grafik);
bool remove(Grafik garfik)
...
...
...
void render ();
}
 
Graf-Porno schrieb:
public interface Grafik {
void add(Grafik grafik);
bool remove(Grafik garfik)
...

Musste schmunzeln bei dem Vertipper und im Anbetracht deines Nicknamens :D

OnTopic:
Interfaces bieten auch noch weitere Vorteile. Sie bieten die Möglichkeit "Verträge" zwischen Klassen auszuhandeln. Somit kann sich Klasse A darauf verlassen, dass Implementierungen eines Interfaces von Typ B immer bestimmte Methoden bereithalten.
Falls man konkrete Implementierungen von Typ B später mal ändern möchte, so muss man nicht (oder kaum) in die Implementierung von Klasse A eingreifen. Man entkoppelt also die Funktionalität von der konkreten Implementierung. Besser noch: die konkrete Implementierung wird nach außen hin versteckt, also gekapselt.
 
Passiert den Besten, ich sollte mich vermutlich mal neu regestrieren wegen dem Namen :D.

Gruß
 
Zurück
Oben