Methode vererben bei überschriebenem Konstruktor?

Kaschina

Mitglied
War wohl blöd formuliert,
die Frage ist, wenn meine Oberklasse einen Konstruktor mit nur einem Parameter hat, die Subklasse aber zwei,
wie kann ich mit einer Methode der Oberklasse dann ein neues Objekt erzeugen?
Casten klappt ja nicht...
(Konstruktor der Oberklasse gibt nur eine Arraylänge an; der der Subklasse zusätzlich einen Boolean Wert.)
 
meinst du so?
Java:
public class Foo {
	private int i;
	public Foo(int i) {
		this.i = i;
	}
}
class FooSub extends Foo {
	private int j;
	public FooSub(int i, int j) {
		super(i);
		this.j = j;
	}
}
 
Dann musst in der abgeleiteten Klasse explizit einen Konstruktor der Superklasse aufrufen, und zwar in der ersten Zeile und mit dem Schlüsselwort [c]super[/c]. Angenommen du hast eine Unterklasse von JFrame, die immer die Titelleiste "Supertolle Anwendung" haben soll:

Java:
public class SupertolleAnwendung extends JFrame {
   public SupertolleAnwendung() {
      super("Supertolle Anwendung"); //ruft den Konstruktor JFrame(String) auf
      ...
   }

}

Nur wenn die Superklasse einen Default-Konstruktor (also einen ohne Argumente) bereitstellt, kann man auf den expliziten Aufruf mit [c]super[/c] verzichten (der Aufruf wird in diesem Fall automatisch vom Compiler eingefügt und steht zwar nicht im Code, aber im Class-File).
 
da kann irgendwas nicht passen. du übergibst dem konstruktor in EndlicheMenge ein array und behandelst das dann wie einen int. das kann schonmal nicht funktionieren. ansonsten passt das, wenn man mal die fehlenden attribute endlicheMenge in EndlicheMenge und include in BegrenzteMenge ausser acht lässt (gehe mal davon aus, dass du die schon auch deklariert hast)
 
Soweit war ich, bzw ich steh auf dem Schlauch... ("oooh, das ist kompliziert, das kann ich nicht...")
Java:
 public class EndlicheMenge {
EndlicheMenge(int[]maxGroesse) {

		endlicheMenge = new int[maximaleGroesse];
}public EndlicheMenge differenz(EndlicheMenge m) {
         vielblabla;
		      return Differenz;
	}

class BegrenzteMenge extends EndlicheMenge {

	public BegrenzteMenge (int maximaleGroesse, boolean include) {
		super(maximaleGroesse);
		this.include =  include; // nur diese Werte, oder alles außer diesen Werten
	}
Wie kann ich hier die Differenz vererben?
 
bei so misserabel formatierten code vergeht mir die lust mir das anzuschauen binnen wenigen sekunden. die methode differenz wird automatisch vererbt, liefert aber natürlich den typ EndlicheMenge. Eine Überlegung wäre vllt ein Interface Menge.

edit: desweiteren kuck dir nochmal meinen vorpost an
 
Naja, die endlicheMenge an sich funktioniert ja, bzw zumindest die Testläufe klappen wie gewollt.
Mein Problem ist - vielleicht bin ichs falsch angegangen, dass man bei der begrenzten Menge angeben soll, ob alle angegebenen Werte enthalten sind, oder alles enthalten ist außer diesen Werten...
Und das heißt ja, mein Konstruktor ändert sich, weil ich noch einen boolean Wert brauche...
 
Java:
public class EndlicheMenge {
	
	  int maximaleGroesse; // Größe eines Arrays initial 0
	  int[]endlicheMenge;		//erstellt ein Array aus der maximalGroesse
	  private int iZaehler;
	  private int countNumbers;
	  
	//Konstruktor für endliche Mengen. Initialgröße 0.
	  EndlicheMenge(int maximaleGroesse) {
		endlicheMenge = new int[maximaleGroesse];
	  }
	  
	  int iZaehler(int elem) {
		  for (int i = 0; i < endlicheMenge.length; i++) {
			  if (endlicheMenge[i] == elem) {
				 iZaehler = i;
				 break;
				 }
		  }
		  return iZaehler;
		  
	  }
	 //prüft ob gesuchter Wert bereits enthalten ist
	  /**
	 * @param elem
	 * @return boolean
	 */
	public boolean enthalten(int elem) {
	    boolean enthalten = false;
			for (int i = 0; i < endlicheMenge.length; i++) { // mit einer Schleife wird das Array von 0 bis zum letzten Element abgesucht
				if (endlicheMenge[i] == elem) {// entspricht ein Element an einer Stelle "i" dem Gesuchten,	// wird "true" ausgegeben
				    enthalten = true;
				    this.iZaehler(elem);	// Speichern des "i"Wertes. Wichtig beim Löschen eines bestimmten Wert
				    break;
				}
			}
			return enthalten; //ansonsten falsch
	  }
	  
	//fügt einen Wert ein, falls er nicht schon vorhanden ist
	/**
	 * @param elem
	 */
	public void einfuegen(int elem) {
		if (!enthalten(elem)) {	// prüft mit der Methode "enthalten(int elem)", ob ein Element bereits in der Menge existiert; wenn "false" =>
			for (int i = 0; i < this.endlicheMenge.length; i++) {
			    if (this.endlicheMenge[i] == 0) {
				this.endlicheMenge[i] = elem;
				break;
			    } 
				
				
			}
		    //endlicheMenge[counter] = elem;// wird an der Stelle "Counter"(im ersten Fall 0) dieses Element eingefügt
		}	
	}
	// löscht einen Wert, falls er vorhanden ist, indem der Wert überschrieben wird vom folgenden rechten. Dadurch wird das Array unkomplizierter
	// genutzt als mit mittigen Nullstellen
	/**
	 * @param elem
	 */
	public void loeschen(int elem) {
		if (this.enthalten(elem)) {
		    this.endlicheMenge[iZaehler] = 0;
		}
	}
	
	int max(EndlicheMenge m) {	// die Größe des kleineren Arrays wird die Größe des neuen
	    int max = 0;
	if (this.endlicheMenge.length > m.endlicheMenge.length)
		 max = m.endlicheMenge.length;
	else max = this.endlicheMenge.length;
		return max;
	}
	/**
	 * @param m
	 * @return durchschnitt
	 */
	public EndlicheMenge durchschnitt(EndlicheMenge m) {
		int max;	// die Größe des kleineren Arrays wird die Größe des neuen
		
		if (this.endlicheMenge.length > m.endlicheMenge.length)
			 max = m.endlicheMenge.length;
		else max = this.endlicheMenge.length;
		
		// eine neue Menge, die die Schnittpunkte der beiden Mengen beinhaltet mit der Groesse max
		EndlicheMenge  durchschnitt = new EndlicheMenge(max);
		
		//zwei Schleifen, die durch beide Arrays laufen. 
		//sind zwei Elemente gleich, wird es dem Durchschnitt hinzugefügt
		for (int i = 0; i < m.endlicheMenge.length; i++ )
			for (int j = 0; j< this.endlicheMenge.length; j++) {
				if (m.endlicheMenge[i] == this.endlicheMenge[j]) 
					durchschnitt.einfuegen(this.endlicheMenge[j]);
			}
		return durchschnitt;
	}
	//Vereinigung von zwei Mengen; beinhaltet alle Werte;
	/**
	 * @param m
	 * @return Vereinigung
	 */
	public EndlicheMenge vereinigung(EndlicheMenge m) {
		
		int max = this.endlicheMenge.length + m.endlicheMenge.length; // Länge ist Summe der beiden Grundmengen
			
		EndlicheMenge Vereinigung = new EndlicheMenge(max);
			for (int i = 0; i < this.endlicheMenge.length; i++) {
			Vereinigung.einfuegen(this.endlicheMenge[i]);
			Vereinigung.einfuegen(m.endlicheMenge[i]);
			}
			for (int i = 0; i < m.endlicheMenge.length; i++) {
				Vereinigung.einfuegen(m.endlicheMenge[i]);
			}
		return Vereinigung;
	}	
	
	//erzeugt die Differenz von zwei Mengen
	/**
	 * @param m
	 * @return Differenz
	 */
	public EndlicheMenge differenz(EndlicheMenge m) {
		int max = this.endlicheMenge.length; //Länge der Differenzmenge entspricht der der aktuellen Menge
		EndlicheMenge Differenz = new EndlicheMenge(max);
			for (int i = 0; i< this.endlicheMenge.length; i++)
				for (int j = 0; j < m.endlicheMenge.length; j++) {
					if (!m.enthalten(this.endlicheMenge[i]))
						Differenz.einfuegen(this.endlicheMenge[i]);
					if (!this.enthalten(m.endlicheMenge[i]))
						Differenz.einfuegen(m.endlicheMenge[i]);
				}
		return Differenz;
	}
	
	// Zählt "nicht-0" Elemente in einem Array
	int countNumbers() {
	    for (int i = 0; i < this.endlicheMenge.length - 1; i++) {
		if (this.endlicheMenge[i] != 0) 
		    countNumbers++;
	    }
	    return countNumbers;
	}
	
	// gibt die Werte eines Arrays ohne Nullen aus
	int[] getNumbers() {
	    	for (int i = 0; i < this.endlicheMenge.length; i++) {
			if ( this.endlicheMenge[i] != 0) 
			    countNumbers++;
	    	}
	    	int[]getNumbers = new int[countNumbers];
	    	int j = 0;
	    	for (int i = 0; i < this.endlicheMenge.length; i++) {
	    	   
	    		if (this.endlicheMenge[i] != 0) {
	    		    getNumbers[j] = this.endlicheMenge[i];
	    		    j++;
	    		}
	    	}
	    	    return getNumbers;
	}
	
	/**
	 * @param m
	 * @return boolean
	 */
	public boolean istGleich(EndlicheMenge m) {
	    for (int i = 0; i < this.getNumbers().length -1; i++) {
		for (int j = 0; j < m.getNumbers().length -1; j++) {
		   	if (this.getNumbers()[i] == m.getNumbers()[j])
		   	    return true;
		}		
	    }
	    return false;
	}
	
	// liefert kompletten derzeitigen Inhalt des aktuellen Arrays 
	
	public String toString() {
		String Ausgabe = "Auszulesendes Array: ||";	 
		for (int i = 0; i < this.endlicheMenge.length; i++)
			Ausgabe += this.endlicheMenge[i] + "||"; // gibt  jedes Element des gewählten Arrays aus.
		return Ausgabe;
		
	}
}



public class BegrenzteMenge extends EndlicheMenge {
	int maximaleGroesse;
	int begrenzteMenge[];
	boolean include;
	
	/**
	 * @param maximaleGroesse
	 */
	public BegrenzteMenge (int maximaleGroesse, boolean include) {
		super(maximaleGroesse);
		this.include =  include;
	}
	
	/**
	 * 
	 */
	public void complement() {
	    include  = !include;
	}
	
	public boolean enthalten(int elem) {
		if (include)
			return super.enthalten(elem);
		else
		    	return !super.enthalten(elem);
	}
	
	public void einfuegen(int elem) {
	    super.einfuegen(elem);
	}
	
	public void loeschen(int elem) {
	    super.loeschen(elem);
	}
	
	/**
	 * @param m
	 * @return BegrenzteMenge 
	 */
	
	int countNumbers() {
	    return super.countNumbers();
	}
	int[]getNumbers() {
	    return super.getNumbers();
	}
	
	
	/*int max(BegrenzteMenge m) {
	    int max=0;
		if (this.countNumbers() > m.countNumbers()) {
			 max = m.countNumbers();
		}
		else {
		    max = this.countNumbers();
		}
		return max;
		
	}
	*/
	/**
	 * @param m
	 * @return BegrenzteMenge
	 */
	public BegrenzteMenge durchschnitt(BegrenzteMenge m) {
	    if (this.include && m.include){
	    EndlicheMenge hilfsmenge = super.durchschnitt(m);
	    	hilfsmenge.getNumbers();
	    	hilfsmenge.countNumbers();
	    }
	    	
	    BegrenzteMenge Durchschnitt = new BegrenzteMenge(super.countNumbers(), m.include);
	    return Durchschnitt;
	    
	}
			
		    

	/**
	 * @param m
	 * @return BegrenzteMenge
	 */
	public BegrenzteMenge vereinigung(BegrenzteMenge m) {
	    return (BegrenzteMenge)super.durchschnitt(m);
	}
	/**
	 * @param m
	 * @return boolean
	 */
	public boolean istGleich(BegrenzteMenge m) {
	    return super.istGleich(m);
	    
	}
	public String toString() {
	    if ( include)
		return super.toString();
	    else 
		return "Alle Zahler außer: " + super.toString();
	}
}


der Code kompiliert, ich wollte einfach nur Ausschnitte zeigen, damit man sieht worum es geht, keinen Mustercode.

Was bei Durchschnitt, Vereinigung und Differenz bei BegrenzteMenge steht ist Quatsch, das weiß ich.
 
das mit dem code kürzen war ja ne gute idee aber dann bitte etwas formatiert.

aber ich habe dir auch schon eine option genannt:
Eine Überlegung wäre vllt ein Interface Menge.

ausserdem kannst du dir sowas sparen:
Java:
    public void einfuegen(int elem) {
        super.einfuegen(elem);
    }
    
    public void loeschen(int elem) {
        super.loeschen(elem);
    }

wofür meinst du denn, dass vererbung ist? Nur wenn sich die Methode in der subklasse unterscheidet benutzte die Annotation @Override und implementiere die Methode in der subklasse anders. Ansonsten wird diese implizit von der superklasse geerbt
 
Die Einfügen und Löschen Methoden waren nur für mich selber, damit ich nichts vergesse...
Ich dachte ursprünglich, ich müsste nur "noch kurz" die Sache mit der Vererbung hinbekommen und dann wars das;
durch dieses ganze Rumgefrickel ist das dann untergegangen...

Kannst du mir zur Vererbung vielleicht noch einen Schubbs geben?
 
du machst ein Interface
Code:
Menge
, worin du alle Methoden vorgibst, die implementiert werden müssen. Dieses Interface implementierst du in beide Klasse. Wenn die Klassen viel Übereinstimmungen haben, könnte das ggf. auch eine Klasse sein. Dadurch sind deine returns der Methoden polymorph und du kannst sie in den beide Klassen unterschiedlich implementieren.
ob du ein Interface oder eine Klasse
Code:
Menge
nimmst und/oder welche Klasse von welcher erbt, kann ich dir nicht abnehmen, weil ich dein Ziel nicht kenne und weniger Lust habe mich da jetzt reinzudenken. Das musst du für dich selbst entscheiden.
Allgemein würde ich aber bei Interfaces und Vererbung nochmal auf Webliteratur verweißen ausser du hast irgendeine explizite Frage.
 

Zurück
Oben