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.
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 :
publicabstractclassAbstractClass{publicString nonAbstractMethodOne(String param1,String param2){String param = param1 + param2;return param;}publicstaticvoid nonAbstractMethodTwo(String param){System.out.println("Value of param is "+param);}}
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.
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.
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
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.
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
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.
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
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.
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.
WindowDecorator
undCoffeeDecorator
sindabstract
Klassen, aber keine enthält eineabstract
Methode.Antworten:
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
final
Methoden haben, aber niemals umgekehrt.quelle
Ja, du kannst es schaffen. Warum versuchst du das nicht einfach?
quelle
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 :
Das ist in Ordnung.
quelle
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.
quelle
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.
quelle
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
quelle
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.
quelle
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
quelle
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:
das wird sicher funktionieren.
quelle
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
quelle
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.
quelle
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.
quelle