Definieren einer abstrakten Klasse ohne abstrakte Methoden

114

Kann ich eine abstrakte Klasse definieren, ohne eine abstrakte Methode hinzuzufügen?

VisaMasterCard
quelle
1
Ein gutes Beispiel finden Sie im Dekorationsmuster, siehe hier . Beide WindowDecoratorund CoffeeDecoratorsind abstractKlassen, aber keine enthält eine abstractMethode.
MS Dousti

Antworten:

168

Natürlich.

Das Deklarieren einer Klassenzusammenfassung bedeutet nur, dass Sie nicht zulassen, dass sie selbst instanziiert wird.

Das Deklarieren einer Methodenzusammenfassung bedeutet, dass Unterklassen eine Implementierung für diese Methode bereitstellen müssen.

Die beiden sind separate Konzepte, obwohl Sie in einer nicht abstrakten Klasse offensichtlich keine abstrakte Methode haben können. Sie können sogar abstrakte Klassen mit finalMethoden haben, aber niemals umgekehrt.

biziclop
quelle
14

Ja, du kannst es schaffen. Warum versuchst du das nicht einfach?

Marc W.
quelle
6
Und es ist nicht nur das OP. Schauen Sie sich alle positiven Stimmen an, die die Frage erhalten hat!
Marc W
54
@ karim79 Es gibt keine Notwendigkeit für hohe Pferde und all das soße-gießende Zeug. Das Ausprobieren zeigt nicht ganz, warum es erlaubt ist, während man es fragt.
Biziclop
7
@bizclop - Das Ausprobieren für sich selbst hätte möglicherweise eine produktivere Frage ergeben. Es gibt keine hohen Pferde. Das ist ziemlich einfach. Seine Frage war "Kann ich" anstatt "Warum tut das ...".
Karim79
8
Wenn die Frage mit einem einfachen Ja oder Nein beantwortet werden kann, sollte der Fragesteller in Betracht ziehen, sie neu zu formulieren, Google zu verwenden oder sie einfach auszuprobieren.
Tyler Treat
3
@ karim79 Ja, die Frage hätte besser formuliert werden können, aber ich denke, es erfordert nicht so viel Mühe, einen Schritt voraus zu sein.
Biziclop
8

Ja, du kannst. Die in Java verwendete abstrakte Klasse bedeutet, dass Sie kein Objekt der Klasse erstellen können. Und eine abstrakte Methode, für die die Unterklassen eine Implementierung für diese Methode bereitstellen müssen.

So können Sie eine abstrakte Klasse ohne abstrakte Methode einfach definieren.

Wie zum Beispiel :

public abstract class AbstractClass{

    public String nonAbstractMethodOne(String param1,String param2){
        String param = param1 + param2;
        return param;
    }

    public static void nonAbstractMethodTwo(String param){
        System.out.println("Value of param is "+param);
    }
}

Das ist in Ordnung.

Shreyos Adikari
quelle
6

JA Sie können eine abstrakte Klasse ohne jede abstrakte Methode erstellen. Das beste Beispiel für eine abstrakte Klasse ohne abstrakte Methode ist HttpServlet. Die
abstrakte Methode ist eine Methode ohne Text. Wenn Sie mindestens eine Methode in der Klasse deklariert haben, muss die Klasse als deklariert werden abstrakt ist obligatorisch ABER wenn Sie die abstrakte Klasse deklariert haben, ist es nicht obligatorisch, die abstrakte Methode innerhalb der Klasse zu deklarieren.

Sie können keine Objekte der abstrakten Klasse erstellen, was bedeutet, dass sie nicht instanziiert werden können.

JegsVala
quelle
4

Ja, Sie können eine Klasse deklarieren, die Sie nicht selbst instanziieren können, nur mit Methoden, die bereits implementiert sind. Dies ist nützlich, wenn Sie in Zukunft abstrakte Methoden hinzufügen möchten oder wenn Sie nicht möchten, dass die Klasse direkt instanziiert wird, obwohl sie keine abstrakten Eigenschaften hat.

Gordon Gustafson
quelle
Die Frage war nicht nach leeren abstrakten Klassen, sondern nur nach abstrakten Klassen ohne abstrakte Methoden. Soweit ich sehen kann, gibt es keinen gültigen Grund für die Verwendung einer vollständig leeren abstrakten Klasse.
Biziclop
1
Antwort behoben. Die Verwendung einer leeren abstrakten Klasse kann nützlich sein, wenn Sie gute Gründe hatten, später abstrakte Methoden hinzuzufügen, und sich nicht mit der Umgestaltung anderer übergeordneter Klassen befassen müssen.
Gordon Gustafson
1
In der Mitte einer Hierarchie kann eine vollständig leere (mit Ausnahme der Vererbungsspezifikation) abstrakte Klasse sinnvoll sein, wenn Ableitungen dieser Klasse andere vertragliche Verpflichtungen haben als andere Ableitungen des Elternteils.
Supercat
3

Ja, wir können eine abstrakte Klasse ohne abstrakte Methode deklarieren. Der Zweck der Deklaration einer Klasse als abstrakt besteht nicht darin, die Klasse zu instanziieren.

also zwei Fälle

1) abstrakte Klasse mit abstrakten Methoden.

Bei dieser Art von Klassen müssen wir eine Klasse von dieser abstrakten Klasse erben und die abstrakten Methoden in unserer Klasse überschreiben, z. B.: GenricServlet-Klasse

2) abstrakte Klasse ohne abstrakte Methoden.

Bei dieser Art von Klassen müssen wir eine Klasse von dieser abstrakten Klasse erben, z. B.: Der Zweck der HttpServlet-Klasse besteht darin, dass Sie die übergeordnete Logik erhalten können, wenn Sie Ihre Logik nicht in einer untergeordneten Klasse implementieren

Bitte überprüfen Sie den HttpServlet-Quellcode

Manoj Kalluri
quelle
2

Ja, wir können eine abstrakte Klasse ohne abstrakte Methoden haben, da beide unabhängige Konzepte sind. Das Deklarieren einer Klassenzusammenfassung bedeutet, dass sie nicht selbst instanziiert und nur in Unterklassen unterteilt werden kann. Das Deklarieren einer Methodenzusammenfassung bedeutet, dass die Methode in der Unterklasse definiert wird.

Vivek Vermani
quelle
Warum sollte ich nicht wollen, dass die Klasse nicht instanziiert werden kann? Ein guter Grund, Beispiel?
Karlihnos
2

Ja, Sie können eine abstrakte Klasse ohne eine abstrakte Methode definieren. Wenn es jedoch keine Methode gibt, sollten Sie sich besser für eine Schnittstelle entscheiden

fmucar
quelle
4
Gute Idee, um das Minimum von 30 Zeichen zu erreichen.
Marc W
1
Wenn es keine abstrakte Methode gibt, wie kann dann eine Schnittstelle verwendet werden? In der Schnittstelle sind standardmäßig alle Methoden abstrakt.
Usman Rana
1

Ja, das kannst du machen.

Das Deklarieren von class abstract bedeutet, dass die Klasse von keiner anderen Klasse instanziiert wird.

und es sollte mindestens eine abstrakte Methode darin sein, und die Bedeutung davon, dass Sie abstrakte Methode in dieser Klasse deklarieren können, wenn Sie Methode nicht als ok deklarieren.

Beispiel:

public abstract class abs {

    protected int cx = 0, cy = 0;

    public void p() {
        System.out.print("hello");
    }
}

das wird sicher funktionieren.

Kishan Dhamat
quelle
1

Ja, du kannst. Manchmal wird Ihnen die Frage gestellt, wozu das gut ist. Die Antwort lautet: Manchmal müssen wir die Klasse daran hindern, selbst zu instanziieren. In diesem Fall möchten wir, dass der Benutzer unsere Abstract-Klasse erweitert und die untergeordnete Klasse instanziiert

Nandkishor Gokhe
quelle
1

Sie können, die Frage in meinem Kopf ist mehr, sollten Sie. Ich werde von Anfang an sagen, dass es keine feste Antwort gibt. Tun Sie das Richtige für Ihre aktuelle Situation.

Vererbung bedeutet für mich eine 'ist-eine'-Beziehung. Stellen Sie sich eine Hundeklasse vor, die um speziellere Untertypen (Elsässer, Pudel usw.) erweitert werden kann. In diesem Fall kann es richtig sein, die Hundeklasse abstrakt zu machen, da Untertypen Hunde sind. Stellen wir uns nun vor, dass Hunde ein Halsband brauchen. In diesem Fall macht die Vererbung keinen Sinn: Es ist Unsinn, eine Beziehung zwischen Hunden und Halsbändern zu haben. Dies ist definitiv eine "hat-eine" Beziehung, Kragen ist ein kollaborierendes Objekt. Es macht keinen Sinn, das Halsband abstrakt zu machen, damit Hunde eines haben können.

Ich finde oft, dass abstrakte Klassen ohne abstrakte Methoden wirklich eine 'has-a'-Beziehung ausdrücken. In diesen Fällen stelle ich normalerweise fest, dass der Code ohne Vererbung besser berücksichtigt werden kann. Ich finde auch, dass abstrakte Klassen ohne abstrakte Methode oft ein Codegeruch sind und zumindest dazu führen sollten, dass Fragen in einer Codeüberprüfung aufgeworfen werden.

Auch dies ist völlig subjektiv. Es kann durchaus Situationen geben, in denen eine abstrakte Klasse ohne abstrakte Methoden sinnvoll ist. Es liegt ganz in der Interpretation und Rechtfertigung. Treffen Sie die beste Entscheidung für alles, woran Sie arbeiten.

Jeremy
quelle
1

Eigentlich gibt es keinen Mittelwert, wenn eine abstrakte Klasse keine abstrakte Methode hat. Eine abstrakte Klasse ist wie ein Vater. Dieser Vater hat einige Eigenschaften und Verhaltensweisen. Wenn Sie als Kind ein Kind des Vaters sein wollen, sagt der Vater das Kind (Sie), das so sein muss, es ist unser MOTO, und wenn Sie es nicht wollen, Sie sind nicht mein Kind.

Mohammad Davari
quelle