Abstrakte Methode in gleicher Klasse aufrufen

Status
Nicht offen für weitere Antworten.

ggirl

Mitglied
Hallo,

ich arbeite gerade ein Tutorial durch, das scheinbar einen Feler hat, den ich nicht lösen kann.
(die 3 problematischen Code-Zeilen: 74, 79, 93)
In der Klasse ImageButton ist eine abstrakte Methode "definiert", die jedoch in der selben Klasse auch wieder innerhalb einer anderen Methode aufgerufen wird.

Was die Methode genau macht ist in der Klasse RolloverButton definiert, die ImageButton "extends".

Ich dachte eigentlich, dass abstrakte Methoden beim deklarieren keine Übergabeparameter haben,
allerdings motzt dann eclipse. Gibt es eine Möglichkeit anzugeben, dass die abstrakte Methode mit 2 Übergabeparametern vom Typ boolean arbeiten wird?

Oder woran liegt es, dass ich in diesem Fall Fehler bekomme und bei der Deklaration von handleMousePressed() nicht (auch diese Methode wird innerhalb einer anderen Methode in der Klasse auch noch einmal aufgerufen in Code Zeile 64 / 95).


Anbei der Code mit der Hoffnung, dass ihr mir helfen könnt:


Code:
import java.awt.*;
import java.awt.event.*;
import java.util.Hashtable;


public abstract class ImageButton extends Component {
  
	// nur für abgeleitieten Klassen zugänglich
	protected Hashtable imageHash; //Bildname zum Ansprechen
	protected Image image;
	protected String imageName;
	protected boolean isMouseDown = false;
	protected boolean isMouseInside = false;
	protected String actionCommand; // erlaubt den Objekten, die vom Button ein ActionEvent erhalten die Quelle der Nachricht zu bestimmen
	protected ActionListener listener = null;
	
	public ImageButton(){
		
		//Listener registrieren
		Mouse aMouse = new Mouse();
		this.addMouseListener(aMouse);
		//Status-Information initialisieren
		imageHash = new Hashtable();
		actionCommand = "ImageButton Action";
	}

/* 
 * Zeichnet den Button
 * wird aufgerufen, wenn die Komponente zum ersten Mal aufgerufen wird oder eine Update-Nachfrage vorliegt
 * @parameter: g > für die Grafik spezifiertes Fenster
 */
	public void paint(Graphics g){
		
		//"Super-Klasse" zeichnet, dann die Zeichnung des aktuellen Bilds hier behandeln
		super.paint(g);
		
		if (image != null){
			g.drawImage(image, 0, 0, this);
		}
	}
	
	//innere Klasse zum Behandeln von Mouse-Events
	class Mouse extends MouseAdapter{
		
		public void mouseExited(MouseEvent event){
			ImageButton_MouseExited(event);
		}
		
		public void mouseEntered(MouseEvent event){
			ImageButton_MouseEntered(event);
		}
		
		public void mouseReleased(MouseEvent event){
			ImageButton_MouseReleased(event);
		}
		
		public void mousePressed(MouseEvent event){
			ImageButton_MousePressed(event);
		}
	}
	
	protected void ImageButton_MousePressed(MouseEvent event){
		isMouseDown = true;
		handleMousePressed();
	}
	
	protected void ImageButton_MouseReleased(MouseEvent event){
		isMouseDown = false;
		handleMouseRelease(isMouseInside);
	}
	
	protected void ImageButton_MouseEntered(MouseEvent event){
		isMouseInside = true;
		handleRollover(isMouseInside,isMouseDown);
	}
	
	protected void ImageButton_MouseExited(MouseEvent event){
		isMouseInside = false;
		handleRollover(isMouseInside,isMouseDown);
	}
	
/*
 * Wird aufgerufen, wenn gedrückter Button losgelassen wird
 * @parameter: isMouseInside > true wenn Maus im Buttonbereich geortet wird
 * @parameter: isMouseInside > false ... do nothing
 */	
	protected void handleMouseRelease(boolean isMouseInside){
		
		if(isMouseInside)
			fireActionEvent();// sended Nachrichten zu allen Objekten, die für den Button als Listener registriert sind um sie zu informieren, dass der Button gedrückt wurde
	}
	
	protected abstract void handleRollover(); // Implementiert in RolloverButton.java
	
	protected abstract void handleMousePressed(); // Implementiert in RolloverButton.java
	
/*
 * Legt ein Bild auf den Button
 * @parameter: imagePath > Ort der Bildquelle (relative Pfadangabe)
 * @parameter: imageName > Referenz-Name des Bilds (nicht der Dateiname), identifiziert Bild für späteren Einsatz im Button
 */	
	public void addImage(String imagePath,String imageName){
		
		//Anforderungen für Hashtable nicht erfüllt > Methode verlassen
		if(imageName !=null && !imageName.equals("")){
			Image newImage = Misc.loadImage(imagePath, this,true);
			if(newImage != null){
				imageHash.put(imageName,newImage);
			}
		}
	}
	
/* 
 * Loescht das Bild eines Buttons
 * @parameter: imageName > Referenz-Name des Bilds
 */	
		public void removeImage(String imageName){
			
			//Anforderungen für Hashtable nicht erfüllt > Methode verlassen
			if(imageName !=null && !imageName.equals("")){
				imageHash.remove(imageName);
			}
		}	
	
	
/* 
 * Aendert das Bild eines Buttons
 * @parameter: imageName > Referenz-Name des Bilds
 */	
	public void setImage(String imageName){
		
		//Anforderungen für Hashtable nicht erfüllt > Methode verlassen
		if(imageName !=null && !imageName.equals("")){
			Image temp = (Image)imageHash.get(imageName);
			if(temp != null){
				image = temp;
				this.imageName = imageName;
				repaint();
			}
		}
	}
	
/*
 * Liefert den Namen des aktuellen Bilds
 * @return: Referenz-Name des Bilds
 */	
	public String getImage(){
		return imageName;
	}
	
/*
 * Setzt den command-Namen des Action Events, das vom Button ausgelöst wurde
 */	
	public void setActionCommand(String command){
		actionCommand = command;
	}
	
/*
 * Gibt den command-Namen des Action Events, das vom Button ausgelöst wurde, zurück
 */	
	public void getActionCommand(ActionListener l){
		listener = AWTEventMulticaster.add(listener,l);
	}

/*
 * Entfernt eeinen bestimmten Action Listener, damit der Button keine Events mehr von Ihm erhält
 */
	public void removeActionListener(ActionListener l){
		listener = AWTEventMulticaster.remove(listener,l);
	}	

/*
 * "Feuert" ein Action Event zu den Listenern
 */
	protected void fireActionEvent(){
		if (listener != null){
			listener.actionPerformed(new ActionEvent (this, ActionEvent.ACTION_PERFORMED, actionCommand));
		}
	}
	
/*
 * Gibt die bevorzugte Größe des Buttons zurück, damit der LayoutManager die Buttongröße kalkulieren kann
 * überschreiben der Methode von java.awt.Component
 */	
	public Dimension getPreferredSize(){
		if (image != null){
			return new Dimension(image.getWidth(this),image.getHeight(this));
		}
		return super.getPreferredSize(); // default-Verhalten der Komponente benutzen
	}
}
[/code]
 
???:L Was genau jetzt die Frage ist... Hm. Du könntest - FALLS ich das richtig verstanden habe - einfach schreiben
Code:
protected abstract void handleRollover(boolean a, boolean b);
und in der Implementierenden Klasse (RolloverButton) dann eben
Code:
protected void handleRollover(boolean a, boolean b)
{
 ...
}
.... Meintest du das? Oder darf die Methode nicht verändert werden?
 
Ja danke, das hab ich gemeint! Freu!

Uns wurde in der Vorlesung halt knallhart erzählt, dass man sowas bei abstrakten Klassen nicht macht.. wäre deshalb nicht auf die Idee gekommen.

Nochmal FETTES DANKE für deine Hilfe, Marco!
 
Dann hat man euch kompletten Unsinn erzählt. Eine Methode wird eindeutig durch ihre Signatur (Name + Parameterliste) bestimmt. Die Signatur muss daher auch bei der abstrakten Definition so angegeben werden, wie sie später aussehen soll. :autsch:
 
Naja, wenn das nicht nur gesagt sondern auch irgendwie begründet werden würde, würde mich der Grund mal interessieren. Vielleicht gibt es irgendein abstrus-theoretisches Argument, weswegen man das als "schlechten Stil" oder so bezeichnen könnte... aber das würde ich jetzt zum ersten Mal hören ???:L
 
Begründet ist es nicht - scheinbar hat unser Dozent aus "Java ist auch eine Insel" abgekupfert und das Musterbeispiel dort einfach ein wenig verändert. Das geht nämlich auch nicht in die Tiefe...

Das Kapitel abstrakte Klassen und Methoden wurde bei uns in der Vorlesung sehr schnell abgehandelt - hätte wirklich intensiver sein sollen meiner Meinung nach.

Wenn ich so überlege ist es nicht so prickelnd, Anfängern einfach zu erzählen, dass eine abstrakte Methode so auszusehen hat wie ich es dachte.

Da zeigt sich mal wieder, dass manche Dozenten nur Theoretiker sind, die übernehmen, was andere geschrieben haben.

Bin froh, dass es Foren gibt, in denen die "Praktiker" vertreten sind. Da zeigt sich mal wieder, dass diejenigen, die sich tagtäglich mit der Sache beschäftigen mehr Ahnung haben als irgendwelche Dr. Prof. XXX.

Danke nochmal für die Hilfe!
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben