abstrakte Klasse implementiert ein Interface

Diskutiere abstrakte Klasse implementiert ein Interface im Java Basics - Anfänger-Themen Bereich.
E

ernst

Hallo allerseits,
Folgender Fall:
Die abstrakte Klasse Tier implementiert die Schnittstelle IDruck mit dem Methodenkopf print().
Das bedeutet eigentlich, dass print() eine abstrakte Methode ist und in der Klasse Tier ausprogrammiert werden muss.
Da Tier aber eine abstrakte Klasse ist und print() eine abstrakte Methode ist, darf print() in Tier nicht ausprogrammiert werden
Es müsste also im folgenden Programm eine Fehlermeldung geben.
Dem ist aber nicht so.
Warum ?

mfg
Ern

Java:
[/B]
package testabstractinterface10;

public class Startklasse {
    public static void main(String[] args) {
    }
}


abstract class Tier implements IDruck{
    private String name;
    public void print(){
        System.out.println("Name="+name);
    }

}
[B]
Hier das Interface:

Java:
[/B]
package testabstractinterface10;
public interface IDruck {
    void print();
}
[B]
 
T

temi

Die abstrakte Klasse Tier implementiert die Schnittstelle IDruck mit dem Methodenkopf print().
Das bedeutet eigentlich, dass print() eine abstrakte Methode ist
Nicht zwangsläufig. Was an der abstrakten Klasse tatsächlich abstrakt ist, das bestimmst du selbst (mit dem Schlüsselwort abstract vor der jeweiligen Methode). Es kann also durchaus sein (und ist vermutlich auch nicht unüblich), dass das Interface in der abstrakten Klasse implementiert wird, z.B.
Java:
interface Printable {
    void print();
}

abstract class AbstractPrintable implements Printable {

    // Implementation des Interfaces
    @Override
    public void print() {
        System.out.println("Dieser Text wird immer gedruckt. Der nachfolgende kommt von der Kindklasse: ");
        doPrint();
    }

    // abstrakte Methode, die von den Kindklassen überschrieben werden muss
    protected abstract void doPrint();
}
 
Zuletzt bearbeitet:
E

ernst

>
>Nicht zwangsläufig. Was an der abstrakten Klasse tatsächlich abstrakt ist,
>das bestimmst du selbst (mit dem Schlüsselwort abstract vor der jeweiligen Methode).
>
Wenn Tier nicht abstrakt ist, dann müsste print() ausprogrammiert werden. Also ist print() in dieser Hinsicht abstrakt.
Deine Argumentation widerspricht der Meinigen.
Wo wird entschieden wer Recht hat ?
Doku ?

mfg
Ern
 
T

temi

Wenn Tier nicht abstrakt ist, dann müsste print() ausprogrammiert werden.
In deinem Beispiel ganz oben ist die Methode print() ausprogrammiert. Das hat mit der als abstrakt gekennzeichneten Klasse nichts zu tun. Die Klasse lässt sich nur nicht instantiieren (weil sie abstrakt ist).

Also ist print() in dieser Hinsicht abstrakt.
Nein!

EDIT: Du kannst durchaus eine abstrakte Klasse programmieren, die keine einzige abstrakte Methode hat und damit voll funktionsfähig wäre. Allerdings lassen sich, wie oben schon geschrieben, abstrakte Klassen nicht instantiieren. Du musst dazu immer eine (oder mehrere) entsprechende Kindklasse erstellen, um Instanzen davon zu erzeugen.

Sobald allerdings eine abstrakte Methode in der Klasse existiert, muss die gesamte Klasse als abstract gekennzeichnet werden.

In deiner gezeigten Klasse sind keine abstrakten Methoden deklariert. Das erkennst du auch daran, dass die Methode print() einen Methodenkörper hat (die geschweiften Klammern). Sogar ein leerer Methodenkörper wäre eine Implementation (die halt nichts tut).
 
Zuletzt bearbeitet:
E

ernst

Gibt es eine Möglichkeit, den Programmierer zu zwingen, daß man in der Klasse Tier die Methode print() ausprogrammieren muß?
Evtl. durch Einführung von Unterklassen von Nutztier ?

mfg
Ern
 
T

temi

Gibt es eine Möglichkeit, den Programmierer zu zwingen, daß man in der Klasse Tier die Methode print() ausprogrammieren muß?
Evtl. durch Einführung von Unterklassen von Nutztier?
Mir ist nicht ganz klar, was du erreichen möchtest.

Richtig zwingen kann man m.M.n. nicht, denn auch die Kindklasse einer abstrakten Klasse kann wieder eine abstrakte Klasse sein, die eben diese Methode nicht implementiert.
 
E

ernst

Mir ist nicht ganz klar, was du erreichen möchtest.

Richtig zwingen kann man m.M.n. nicht, denn auch die Kindklasse einer abstrakten Klasse kann wieder eine abstrakte Klasse sein, die eben diese Methode nicht implementiert.
Ich will erreichen, dass ein evtl. unaufmerksamer Programmierer gezwungen wird, eine Methode auszuprogrammieren, weil sonst der Compiler einen Fehler bringt. Und das geht meines Wissens mit abstrakten Methoden bzw. Interfaces.

mfg
Ern
 
C

CSHW89

Dann solltest du die Methode "print" in der Klasse Tier eben nicht implementieren:
Java:
abstract class Tier implements IDruck{
    private String name;
}
// bzw...
abstract class Tier implements IDruck{
    private String name;
    public abstract void print();
}
 
E

ernst

Dann solltest du die Methode "print" in der Klasse Tier eben nicht implementieren:
Java:
abstract class Tier implements IDruck{
    private String name;
}
// bzw...
abstract class Tier implements IDruck{
    private String name;
    public abstract void print();
}
Ich will, dass der Programmier gezwungen wird, die Methode print() in der Klasse Tier auszuprogrammieren.
Das leistet dein Vorschlag nicht.

mfg
Ern
 
T

temi

Ich will erreichen, dass ein evtl. unaufmerksamer Programmierer gezwungen wird, eine Methode auszuprogrammieren
Auf den konkreten Fall bezogen: Meinst du den unaufmerksamen Programmierer, der die Klasse "Tier" programmiert oder den, der die Kindklasse von "Tier" programmiert?

Die Lösung für den zweiten Fall hat dir @CSHW89 bereits genannt: Du darfst die Methode aus dem Interface in der abstrakten Klasse Tier einfach nicht implementieren.
 
mihe7

mihe7

Ich will erreichen, dass ein evtl. unaufmerksamer Programmierer gezwungen wird, eine Methode auszuprogrammieren, weil sonst der Compiler einen Fehler bringt. Und das geht meines Wissens mit abstrakten Methoden bzw. Interfaces.
Zum letzten Satz: jein. Natürlich wird spätestens die Klasse, von der eine Instanz erzeugt wird, die Methode implementieren müssen. Du kannst aber niemanden daran hindern, zuvor erneut eine abstrakte abgeleitete Klasse zu erstellen, in der die Methode nicht implementiert wird.

Der erste Satz ist ein Widerspruch in sich. Du willst den Programmierer dazu zwingen. Und wer setzt das durch? Richtig, der Compiler. Du willst also einen Compilerfehler durch einen Compilerfehler verhindern. Gibt jetzt nicht wirklich Sinn.
 
M

Meniskusschaden

Ich will, dass der Programmier gezwungen wird, die Methode print() in der Klasse Tier auszuprogrammieren.
Warum willst du ihn denn zwingen, das unbedingt in der direkten Unterklasse Tier zu tun? Warum genügt es nicht, das in Tier oder in darunter liegenden Subklassen zu tun? Der Sinn des Ganzen ist noch immer unklar.
 
T

temi

Wer sagt außerdem, dass es eine Klasse Tier überhaupt geben muss? Der Programmierer kann ja jederzeit eine beliebige Klasse erstellen, die das Interface implementiert.
 
E

ernst

Wer sagt außerdem, dass es eine Klasse Tier überhaupt geben muss? Der Programmierer kann ja jederzeit eine beliebige Klasse erstellen, die das Interface implementiert.
Gegegen ist:
die abstrakte Klasse Tier.

Behauptung:
Es gibt keine Möglichkeit, einen Programmier zu zwingen die Methode print() in Tier auszuprogrammieren.
Unter zwingen verstehe ich: Wenn die Methode nicht in Tier ausprogrammiert wird, soll der Compiler eine Fehlermeldung bringen.

Frage:
Ist meine Behauptung richtig?

mfg
Ern
 
L

LimDul

Das geht nicht. Wenn eine Klasse abstrakt ist, müssen die Methoden auch nicht ausprogrammiert werden.

Aber diese ganze Diskussion ist sinnlos. Man gibt mit einem Interface oder einer abstrakten Klasse eine Schnittstelle vor. Wer dann konkrete Klassen ableitet musst die fehlenden Reste der Schnittstelle implementieren. Von vorneherein Vorgaben zu machen, was genau man machen muss in Ableitungen und wie die Ableitungen strtukturiert werden (ob Abstrakt oder nicht) ist weder möglich noch sinnvoll oder zielführend.
 
T

temi

Mach dich mal frei von dem Interface und der abstrakten Klasse und versuche zu beschreiben, was du erreichen möchtest.

Was ist dein konkreter Anwendungsfall?

Vielleicht gibt es ja eine Lösung dafür, abseits von dem bisher geschriebenen.
 
Thema: 

abstrakte Klasse implementiert ein Interface

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben