Inteface-Programmierung

MariusMeier

Mitglied
Hallo zusammen!

Ich habe folgendes Interface definiert

Code:
public interface IFilter {

	public abstract void setQFactors(java.util.Vector[][] qFactors);

	public abstract void setSeparateDenominator(String[] separateDenominator);

	public abstract void setSeparateNumerator(String[] separateNumerator);

	public abstract java.util.Vector[][] getZeroPoints();

	public abstract void setZeroPoints(java.util.Vector[][] zeroPoints);

	public abstract void setType(String type);

	public abstract String getType();

	public abstract String[] getSeparateNumerator();

	public abstract String[] getSeparateDenominator();

	public abstract java.util.Vector[][] getQFactors();

	public abstract void setPolePoints(java.util.Vector[][] polePoints);

	public abstract java.util.Vector[][] getPolePoints();

	public abstract void setNumerator(String numerator);

	public abstract String getNumerator();

	public abstract void setDenominator(String denominator);

	public abstract String getDenominator();

}

Dieses Interface implementiere ich bei der Klasse Active Filter welche noch die Klasse Oservable erbt:
Code:
public class ActiveFilter extends Observable implements IFilter { 
...... (Alle methoden sind vom interace implementiert worden)
}

Ach ja diese Klasse ActiveFilter ist ein Singelton (getInstance).
Nun die Frage.... ich sollte ja jetzt gegen das Interface programmieren... bzw wenn ich die Klasse ActiveFilter brauchen will so in etwa:
Code:
IFilter fil1 = ActiveFilter.getInstance();
fil1. ........

Nur die Klasse ActiveFilter hat ja die Klasse Observable geerbt ... doch das Objekt fil1 erlaubt mir nicht die methode fil1.addObserver(...) aufzurufen.... warum das

Hab da was wohl nicht verstanden!

MFG Marius Meier
 
Wenn du ein Interface verwendest so kannst du auf diesem auch nur die Methoden aufrufen die im Interface definiert sind und addObserver ist im Interface nun einmal nicht definiert.
 
Observer sollte dann wohl auch ein Interface sein, von dem IFilter dann erbt. So hast du die addObserverMethode auch auf dem Interface zur Verfügung.

Gruß
Ollie
 
Observer sollte dann wohl auch ein Interface sein, von dem IFilter dann erbt. So hast du die addObserverMethode auch auf dem Interface zur Verfügung.

Nee leider nicht. Observer hat diese Methoden nicht, da Observer ein Observable überwacht, also die andere Seite darstellt. Und für Observable gibt es kein Interface, somit lässt sich das so nicht einfach lösen.

Was aber trotzdem geht ist IFilter einfach die Methode
public void addObserver(Observer o);
zu geben und alles so zu lassen wie es ist.

In ActiveFilter übernimmt dann Observable die Implementierung eben dieser Methode.

Wenn es denn das ist was gewollt ist...
 
Hi,

die addObserver-Methode sollte aber zumindest (ob nun abstrakt oder nicht) in der Observable-Klasse deklariert sein. Sie in einem ganz anderen Interface "über Kreuz" neu zu definieren macht nicht viel Sinn, dadurch wird sie für Observable selbst auch nicht sichtbar.

doch das Objekt fil1 erlaubt mir nicht die methode fil1.addObserver(...) aufzurufen....
Zeig mal den Code, von dem aus du das versuchst. Und was sagt denn der Compiler dazu, wie macht es sich bemerkbar, dass du nicht darauf zugreifen darfst?

Grüße, D.
 
die addObserver-Methode sollte aber zumindest (ob nun abstrakt oder nicht) in der Observable-Klasse deklariert sein. Sie in einem ganz anderen Interface "über Kreuz" neu zu definieren macht nicht viel Sinn, dadurch wird sie für Observable selbst auch nicht sichtbar.

Zeig mal den Code, von dem aus du das versuchst. Und was sagt denn der Compiler dazu, wie macht es sich bemerkbar, dass du nicht darauf zugreifen darfst?

Hö? Darum geht es doch gar nicht. Er versucht auf seinem Interface eine Methode aufzurufen die nur in der implementierenden Klasse ActiveFilter vorhanden ist. Und das geht nunmal nicht. Eine Möglichkeit die Methode trotzdem aufzurufen ist die von mir genannte.

Aktuelle Situtation:
Java:
public interface IFilter {
}

public static class ActiveFilter extends Observable implements IFilter {
}

public static void main(String[] args) {
	ActiveFilter filter = new ActiveFilter();
	filter.addObserver(null); // Geht

	IFilter filter2 = new ActiveFilter();
	// filter2.addObserver(null)//geht nicht
}

Lösungsvorschlag:
Java:
public interface IFilter {
	public void addObserver(Observer o);
}

public static class ActiveFilter extends Observable implements IFilter {
}

public static void main(String[] args) {
	ActiveFilter filter = new ActiveFilter();
	filter.addObserver(null); // Geht

	IFilter filter2 = new ActiveFilter();
	filter2.addObserver(null);// Geht!!
}
 
Ups, mein Fehler... bin noch nicht ganz wach, sorry. :(

Und dennoch: Ich würde die Methode nicht nochmal doppelt im Interface deklarieren, sondern das ganze direkt über das schon vorhandene Observable lösen:

Java:
((Observable) fil1).addObserver(null);

Grüße, D.
 
Und dennoch: Ich würde die Methode nicht nochmal doppelt im Interface deklarieren, sondern das ganze direkt über das schon vorhandene Observable lösen:
Java:
((Observable) fil1).addObserver(null);

Würde ich auch :) Daher ja mein Zusatz "wenn man das so möchte". Wenn alle Implementierungen von IFilter das können sollen, ist es ja durchaus in Ordnung dem Interface die Methode hinzuzufügen, dann kann man beim casten nichts falsch machen.
 
Grunsätzlich muss man doch nicht die Klassen der JavaAPI für sowas nutzen. Das Observable eine Klasse ist, ist für mein Grundverständnis einfach völlig falsch. Schon aufgrund der Namenswahl hätte ich dahinter ein Interface vermutet.

Und die paar Methoden für die Kommunikation von Hand zu Coden sollte nicht die Hürde sein. Zumal man damit auch den Status typsicher machen kann und nicht wie wild immer Object casten muss.

Gruß
Ollie

PS: Ich hatte oben Observable gemeint... Observer war ein Typo...
 
Zurück