verdeckte abstrakte Methode sinnvoll?

ernst

Top Contributor
Hallo Gemeinde,
Haben verdeckte, abstrakte Methoden einen Sinn?

Folgender Fall (Beispiel)

1)
Java:
abstract class A{
    public abstract void f ();  
}

abstract class AA extends A{
}

class AAA extends AA{
  public void f (){
    System.out.println("Hallo");  
  }  
}

Klasse A vererbt an Klasse AA die abstrakte Methode f, also muß AA wieder abstact sein.
Das ist mir alles noch klar.
Aber jetzt Folgendes:

2)
Java:
abstract class A{
    public abstract void f ();  
}

abstract class AA extends A{
    // Hat das einen Sinn???
    public abstract void f ();  
}

class AAA extends AA{
  public void f (){
    System.out.println("Hallo");  
  }  
}

Was verändert sich, wenn man in Klasse AA die verdeckte abstrakte Methode f einfügt?
Hat dies einen Sinn?
Wenn ja, welchen ?
Das ist mir nicht klar.

mfg
ernst
 
Hi,
Das macht schon Sinn. In der Klasse AA ist die Methode f() abstrakt. Das heisst, alle Klassen, die von AA erben, müssen entweder die abstrakte Methode f() implementieren. Wenn nicht, dann wäre(n) die erbenden Klassen von AA auch wieder abstrakt.
Damit kannst du erreichen, dass du in Klasse AA abstrakte Methoden definierst, welche alle erbenden Klassen implementieren müssen. Dies ist Sinnvoll wenn du garantieren möchtest, dass das Verhalten von allen erbenden Klassen gleich funktioniert, d.h. Egal ob es nun ein z.B. AAA oder ein AAB ist, die Methode, welche in AA definiert wurde, kann bei Instanzen von AAA oder AAB auf gleiche Art und Weise ausgeführt werden und gibt in beiden Fällen etwas zurück.
z.B. Eine abstrakte Klasse Car.
Diese hat eine abstrakte Methode public abstract String getCarType();
Nun implementierst du 2 Klassen, z.B. VW und Audi. Beide Klassen erben von Car und implementieren die Methode getCarType(). Beim Aufruf von getCarType wird dann jeweils VW oder Audio zurückgegeben.
Java:
public abstract class Car {
   public abstract String getCarType();
}

public class Audi extends Car{
public String getCarType() {
   return "Audi";
}

}
public class VW extends Car{
public String getCarType() {
   return "VW";
}
}

Du kannst es so anschauen, wenn eine Klasse AAA von AA erbt, dann soll die Klasse AAA gefälligst den Vorgaben folgen, die in AA defniert wurden, also so eine Art von Vertrags- Verhältnis zwischen Erbenden und Vererbenden Klassen.

Gruss knilch
 
Zuletzt bearbeitet:
Danke für deine Antwort.
Aber warum kann ich das nicht mit meinem Fall 1 (siehe Ursprungsposting von mir) erreichen:
(Hier nochmals aufgeführt):

Java:
abstract class A{
    public abstract void f ();  
}

abstract class AA extends A{
}

class AAA extends AA{
  public void f (){
    System.out.println("Hallo");  
  }  
}

mfg
ernst
 
Einen wirklichen Sinn haben sie nicht.

Vorteile können sein:
- Es ist sofort ersichtlich, warum die Klasse AA ebenfalls abstract ist.
- Du kannst unterschiedliche JavaDoc-Kommentare verfassen (oder sonstige über Annotations gesteuerten Krams)

Es leidet jedoch die Wartbarkeit, wenn du Code (unnötigerweise) duplizierst (DRY)
 
Zuletzt bearbeitet:
Hi,
Die 1. Variante von dir geht:
AA erweitert A, aber f() wird nicht implementiert. Somit wird AA abstrakt. Erst in AAA wird f() implementiert. Das Funktioniert so.
Auch die 2. Vairante geht, es macht aber keinen Sinn eine abstrakte Methode die in A schon mal definiert wurde, in AA nochmals mit dem selben Methodenrumpf zu definieren. (sorry, hab erst jetzt bemerkt, dass du in der 2. Variante in AA die Methode f() nochmals definiert hast... )
 
>
>- Du kannst unterschiedliche JavaDoc-Kommentare verfassen (oder sonstige über Annotations gesteuerten Krams)
>
Welchen Sinn hat das ?
Es ist doch die gleiche Methode.


>
>Es leidet jedoch die Wartbarkeit, wenn du Code (unnötigerweise) duplizierst (DRY)
>
Du meinst, wenn man die Methode
public abstract void f ();
ändern will z.B. zu
public abstract void f (int i);
dann muß man sie an 2 Stellen ändern.
Wenn man eine vergißt, hat man ein anderes Programm.
Meinst du das damit?

mfg
ernst
 
Ja, es ist die gleiche Methode aber ggf. Hast du keine Möglichkeit diese zu ändern, weil es aus einer Bibliothek kommt.

--

Ja, du musst es an zwei Stellen ändern , falls man das kann.

Insgesamt kann man das theoretisch so nicht bewerten. Und ich glaube sowas macht auch keiner.
 
Oder kurz und bündig:
Nein, im Allgemeinen hat es keinen Sinn, in Klasse AA die Methode f nochmal zu erwähnen.

Ansonsten schließe ich mich voll stg's Antwort an.
 

Zurück
Oben