Problem bei Vererbung abstrakter Klassen

djafix

Mitglied
Hallo Leute,
ich habe ein Problem bei der Umsetzung des Beobachter-Patterns zur Nutzung des MVC-Entwurfsmusters:

Ich habe zuerst eine abstrakte Klasse "AbstractObserver" erstellt. Diese Realisiert die Funktionalitäten des Beobachters. Danach habe ich eine Klasse "AbstractView" erstellt, die diese Klasse spezialisiert. Diese hat zusätzlich als Attribut eine Instanz vom Typ "Model". Model widerum hat als Attribut eine Instanz einer Klasse "Problem" und eine Methode "Problem getProblem()".

Wenn ich jetzt anfang eine Klasse "TextView" zu erstellen (diese spezialisiert AbstractView), und in dieser in der update-Methode (die Methode die beschreibt, wie der Observer/die View mit Änderungen des Observables/Models umgeht) die Methode "this.Observable.getProblem()" aufrufen will, bringt mir der Compiler die Meldung, dass die Klasse AbstractObservable keine Methode namens "getProblem()" enthält.

Aber zu diesem Zeitpunkt ist das "AbstractObservable" ja bereits vom Typ "Model". Deshalb frage ich mich, warum die Methode dort nicht aufgerufen werden kann. Ich habe absolut keine Ahnung, woran das liegen könnte ???:L. Hier ist noch der Quelltext der einzelnen Klassen (das ist jetzt sicherlich extrem viel, aber ich hoffe es findet sich jemand, der mir helfen kann :( )

Java:
package observerPattern;
import problem.*;
public abstract class AbstractObserver implements ObserverInterface {

	protected AbstractObservable observable;
	public abstract void update();

	public void setObservable(AbstractObservable observable){
		//this.observable.deleteObserver(this);
		this.observable = observable;
		this.observable.registerObserver(this);
	}
	
}

Java:
package view;
import observerPattern.*;
import model.*;
public abstract class AbstractView extends AbstractObserver implements ViewInterface {

	String name;
	
	public AbstractView(String name){
		super();
		this.name = name;
		this.setObservable(new Model());

	}
	
	public void setName(String name){
		this.name = name;
	}
	public String getName(){
		return name;
	}
	
	public abstract void resetView();
	
}
Java:
package view;
import problem.*;
import observerPattern.*;
import model.*;
public class TextView extends AbstractView {

	String text = "";

	public TextView(){
		super("TextView");
	}
	public void resetView(){
		this.text = "";
	}
	public void update(){
		//hier wird entschieden, wie TextView mit einer Änderung des Models/Problems umgeht
		Problem tempProblem = observable.getProblem(); // HIER TRITT DER FEHLER AUF!!!!
		System.out.println(tempProblem.getIsFinished());
	}
	
	
}
Java:
package observerPattern;
import java.util.*;
import problem.*;



public abstract class AbstractObservable{

	protected List<AbstractObserver> observers;
	Object object = new Object();

	public AbstractObservable(){
		observers = new ArrayList<AbstractObserver>();
	}
	public void registerObserver(AbstractObserver observer){
		observers.add(observer);
	}
	public void deleteObserver(AbstractObserver observer){
		observers.remove(observer);
	}
	public void notifyObservers(){
		
		for(AbstractObserver o : observers){
			o.update();
		}
		
	}
	public void update(Object newProblem){
		this.object = newProblem;
		notifyObservers();
	}
	public Object getObject(){
		return this.object;
	}

	
	
}
Java:
package model;
import observerPattern.*;
import problem.*;
import algorithm.*;
public abstract class AbstractModel extends AbstractObservable{

	
	AbstractAlgorithm algorithm;
	protected Problem problem;
	public void performAlgorithm(){
		
	}


	public void performStep(){
		this.algorithm.performStep();
	}
	public AbstractModel(){
		super();
		this.problem = new Problem();
		this.algorithm = new ForwardScheduling(this.problem);
		
	}
	public Problem getProblem(){
		return this.problem;
	}
	
}
Java:
package model;

public class Model extends AbstractModel{

}
Schonmal danke im Vorraus an alle :)
 
Zuletzt bearbeitet:

hauptDev

Bekanntes Mitglied
Hallo

Java:
Problem tempProblem = observable.getProblem();
Also: die Variable observable ist eine Instanz der Klasse AbstractObservable. Kannst du darin eine Methode getProblem() finden? Nein! Du musst also, versuchen observable erst in ein AbstractModel zu casten:
Java:
((AbstractModel) obersable).getProblem();

Wollt noch mehr schreiben, muss aber zum Zahnarzt bis gleich :D
 
Zuletzt bearbeitet:

Natac

Bekanntes Mitglied
Da der Compiler meckert, wir es zur Compile-Zeit entschieden. Und da sieht der Compiler nur, dass
Code:
observable
vom Typ
Code:
AbstractObservable
ist. Und dieser hat keine Methode
Code:
getProblem()
.

Du könntest
Code:
AbstractObserver
parametrisieren, sodass du über Gernerics den Typ des verwendenten Observers festlegen kannst:
Java:
public abstract class AbstractObserver<O extends  AbstractObservable> implements ObserverInterface {
 
    protected O observable;
    public abstract void update();
 
    public void setObservable(O observable){
    ...
    }
}

AbstractView könntest du dann so implementieren:

Java:
public abstract class AbstractView extends AbstractObserver<Model> implements ViewInterface {
...
[/Java]
 
Zuletzt bearbeitet:

hauptDev

Bekanntes Mitglied
Was ich noch dazu sagen wollte, in der Java API gibt es bereits die Klasse [JAPI]Observable[/JAPI] und das Interface [JAPI]Observer[/JAPI], welche du nutzen kannst.

Wenn es dir aber um das Pattern geht, sei gesagt, dass sich normalerweise der Observer beim Observable registriert. Was du bisher auch machst, aber die Methode setObservable sieht mir etwas unstimmig aus. Die Observer bekommen vom Observable Informationen und müssen von diesem Observable eigentlich nichts wissen.
 
Zuletzt bearbeitet:

djafix

Mitglied
@Natac:das mit den generics werde ich mal ausprobieren. aber ich hatte gedacht, man könnte das auch etwas einfacher lösen indem man z.b. im konstruktor von TextView dem compiler sagt, dass observable nun vom typ model ist
Code:
this.observable = new Model();

@hauptDev: die referenz auf das observable habe ich ja genau deshalb eingeführt, damit ich dann (wenn es dann funktioniert) auf die methoden des observables in der update-methode zugreifen kann. oder ist es im sinne des observer-patterns besser, einfach eine referenz auf das observable in der parameterliste von update mitzugeben? vielleicht würde das auch schon direkt mein problem lösen..das werden ich dann gleich mal ausprobieren :idea:

ob es für meinen zweck sinn macht, das observable und den observer der java API zu nutzen weiß ich nicht genau, da ja dort z.b. die update-methode lediglich ein argument vom typ observable und vom typ object enthält....oder könnte man anstelle von object auch einfach model nutzen? (theoretisch erbt model ja sowieso von object)

edit: so ich habe jetzt beides ausprobiert, einmal die klassen als generics zu implementieren und einmal in der update-methode eine referenz auf
Code:
this
zu übergeben. aus einem mir immernoch unbekannten grund merkt
Code:
TextView
einfach nicht, dass es sich bei der übergebenen referenz um ein
Code:
Model
und nicht um einen
Code:
AbstractObserver
handelt. ich bin da langsam mit meiner vorstellungskraft am ende, warum das so sein könnte
 
Zuletzt bearbeitet:

djafix

Mitglied
sooo,ich hab noch bisschen rumprobiert und das problem jetzt gelöst, indem ich observer und observable aus der java-api ableiten lassen hab und dann in der update-methode des observers das "object" zu model gecastet habe.

Java:
	@Override
	public void update(Observable observable, Object model) {
		Model tempModel = (Model)model;
		Problem tempProblem = tempModel.getProblem();
		
		System.out.println(tempProblem.getIsFinished());
		
	}

und das funktioniert auch :D allerdings frage ich mich, warum der cast nicht auch mit meinen selbst erstellten observer- und observable-klassen funktioniert hat...

jedenfalls vielen dank für eure hilfe! :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
temi Problem mit Aufrufreihenfolge bei Vererbung Allgemeine Java-Themen 3
T Super Klasse Vererbung Problem :/ Allgemeine Java-Themen 10
T Problem mit Vererbung Allgemeine Java-Themen 3
K Problem mit Vererbung - Kein wirklicher Nutzen. Allgemeine Java-Themen 10
krgewb Problem mit Umlauten und Eszett bei InputStream Allgemeine Java-Themen 3
Max246Sch Backtracking Problem Box Filler Allgemeine Java-Themen 6
NightVision402 VisualVM Startskript Problem Allgemeine Java-Themen 3
javaBoon86 Email Server Connection Problem Allgemeine Java-Themen 1
F Problem mit PDFBOX Library Allgemeine Java-Themen 1
A Java modul Problem Allgemeine Java-Themen 4
D Read JSON File Problem Allgemeine Java-Themen 9
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
J Problem mit JasperReports Allgemeine Java-Themen 8
M log4j Problem mit jlink Allgemeine Java-Themen 19
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
torresbig Website login Problem - Jsoup, wie bisher, klappt nicht! Allgemeine Java-Themen 31
P Selenium . getText Problem Allgemeine Java-Themen 9
A Jar zu Exe Problem Allgemeine Java-Themen 13
sserio Variablen Liste erstellt und ein Problem mit dem Index Allgemeine Java-Themen 6
S Folgendes Problem bei einem Programm Allgemeine Java-Themen 1
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
A Thread.sleep Problem Allgemeine Java-Themen 2
A Problem bei der Nachbarschafttest Allgemeine Java-Themen 11
Splayfer Problem: no main manifest attribute Allgemeine Java-Themen 3
G javamail Problem beim Empfangen von Nachrichten Allgemeine Java-Themen 3
Splayfer JDA Problem mit MessageCounter Allgemeine Java-Themen 0
Splayfer Problem mit BufferedWriter Allgemeine Java-Themen 3
F Streams als Alternative für dieses Problem ? Allgemeine Java-Themen 15
N Maven Problem mit Datenbanktreiber (H2 Embedded) Allgemeine Java-Themen 12
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
B Einfach Elemente zweier Arraylisten kreuz und quer vergleichen, min und max Problem? Allgemeine Java-Themen 16
C ArrayList Problem Allgemeine Java-Themen 3
kev34 nim-Spiel problem Allgemeine Java-Themen 1
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0
G Welches Problem besteht bei den Typparametern? Allgemeine Java-Themen 5
Sumo_ow "ArrayIndexOutofBoundsException: 2" Array Problem Allgemeine Java-Themen 6
T PIM basierend auf netbeans via AnyDesk Problem Allgemeine Java-Themen 3
xGh0st2014 Problem mit Java Array Allgemeine Java-Themen 1
Kirby.exe Verständnis Problem bei Rucksack Problem Allgemeine Java-Themen 6
B Eclipse-Lombok-Problem Allgemeine Java-Themen 19
I Input/Output ObjectOutputStream - Problem Allgemeine Java-Themen 7
1 Multiple Choice Knapsack- Problem Allgemeine Java-Themen 2
kodela Problem mit strukturiertem Array Allgemeine Java-Themen 18
E Problem mit Gridlayout und Button Allgemeine Java-Themen 2
A Array Problem Allgemeine Java-Themen 8
bueseb84 Problem Allgemeine Java-Themen 0
S Problem mit Arrays Allgemeine Java-Themen 1
D Nullpointer Exception Problem Allgemeine Java-Themen 5
B Problem mit meinen Klassen Allgemeine Java-Themen 6
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
J Problem beim Umstellen auf Java jdk 13 Allgemeine Java-Themen 3
J Problem bei Install java 13 Allgemeine Java-Themen 3
X Profitable Reise Problem Allgemeine Java-Themen 32
A Problem beim öffnen von Java-Installern Allgemeine Java-Themen 1
Dann07 Problem mit JavaMail API Allgemeine Java-Themen 26
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
L Klassen Algorithmus für das folgende Problem entwickeln? Allgemeine Java-Themen 30
J Clear-Problem Allgemeine Java-Themen 10
B Problem zu einem Java Projekt Allgemeine Java-Themen 6
S JFileChooser Problem Allgemeine Java-Themen 4
M Traveling Salesman - MST Heuristik Problem Allgemeine Java-Themen 4
J Traveling Salesman Problem Allgemeine Java-Themen 14
E Java Editor Problem mit 2er Exceptions Allgemeine Java-Themen 12
C code oder Bibliotheken für 2-Center Problem Allgemeine Java-Themen 4
M Salesman Problem - Bruteforce Algorithmus Allgemeine Java-Themen 23
S Methoden Problem mit NullPointerException Allgemeine Java-Themen 9
Javafan02 Problem mit if-clause Allgemeine Java-Themen 17
J Lombok Problem mit Konstruktoren bei Verberbung Allgemeine Java-Themen 1
kodela Event Handling Problem mit der Alt-Taste Allgemeine Java-Themen 16
W Threads Problem Allgemeine Java-Themen 15
D (Verständnis-)Problem mit Unterklasse Allgemeine Java-Themen 4
S Problem mit Generic bei unmodifiableCollection Allgemeine Java-Themen 4
S jserialcomm Problem Allgemeine Java-Themen 1
Flynn Thread-Problem... Allgemeine Java-Themen 2
J Generische Interface - Problem Allgemeine Java-Themen 3
G Problem beim GUI Allgemeine Java-Themen 9
L Applet Problem "security: Trusted libraries list file not found" ? Allgemeine Java-Themen 7
A OOP Problem beim Berechnen der größten Fläche eines Ringes Allgemeine Java-Themen 19
T Problem mit externen Datenbankzugriff über SSH Tunnel Allgemeine Java-Themen 4
F Problem beim Einlesen einer Textdatei Allgemeine Java-Themen 12
S Java OpenOffice Problem mit Windows-Benutzerwechsel Allgemeine Java-Themen 19
K Threads RAM Problem Allgemeine Java-Themen 20
P Operatoren Problem mit Zähler in recursiver Schleife Allgemeine Java-Themen 2
C Int Problem Allgemeine Java-Themen 8
C J2V8 NodeJs Java Bride Problem und Frage!?!? Allgemeine Java-Themen 1
J Problem bei Hashmap Key-Abfrage Allgemeine Java-Themen 4
C Webseiten Programm problem Allgemeine Java-Themen 5
M LocalDate Problem Allgemeine Java-Themen 4
J "Problem Objektorientierung" Allgemeine Java-Themen 20
geekex Problem Meldung! Was tun?! Allgemeine Java-Themen 19
T Klassen Override Problem Allgemeine Java-Themen 7
L Unbekanntes Problem Allgemeine Java-Themen 1
FrittenFritze Problem mit einer JComboBox, Event temporär deaktivieren Allgemeine Java-Themen 11
Blender3D Java Swing Programm Windows 10 Autostart Problem Allgemeine Java-Themen 2
F HTTPS Zertifikat Problem Allgemeine Java-Themen 3
M OpenCV KNearest Problem Allgemeine Java-Themen 0
Tommy Nightmare Project Euler: Problem 22 Allgemeine Java-Themen 2
C Abstrakte Klasse, lokale Variable-Problem Allgemeine Java-Themen 1
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
P Eclipse Projekt anlegen macht Problem Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben