Was ist der Sinn einer abstrakten Klasse?
Verstehe ich, was eine abstrakte Klasse ist in OOP-Paradigma. Ja eine abstrakte Klasse ist ein unvollständiger Typ, kann nicht instanziiert werden.
Unterklassen der abstrakten Klasse erweitert die Superklasse und so weiter, und rufen Sie eine Methode durch Verwendung einer base-Typ-Variablen. Aber das ist, was ich nicht bekommen.
Ich lese das Buch, und der Autor Sprach über eine Oberklasse-variable, um die Referenz einer Unterklasse und ruft eine gängige Methode ruft die richtige Methode. Und ja, das ist wahr. Zum Beispiel dieser kleine code, den ich schrieb:
public class ObjectOne extends SuperObject {
public String objectString()
{
return "objectString() of class ObjectOne\n" ;
}
}
public class ObjectTwo extends SuperObject {
public String objectString()
{
return "objectString() of class ObjectTwo\n" ;
}
}
public class ObjectThree extends SuperObject {
public String objectString()
{
return "objectString() of class ObjectThree\n" ;
}
}
public class SuperObject {
public String objectString()
{
return "SuperObject" ;
}
}
import static java.lang.System.out ;
public class ControlClass {
public static void main(String[] args)
{
SuperObject [] arr = {new ObjectOne(), new ObjectTwo(), new ObjectThree()} ;
for(SuperObject elem:arr)
{
out.println(elem.objectString()) ;
}
}
}
Em, also, wenn main führt die richtige Methoden aufgerufen werden, die für die Objekte einfach mit der Verweis-Typ. Meine Frage ist also, was ist der Sinn einer abstrakten Klasse? Polymorphismus funktioniert unabhängig davon, ob die Methode oder Klasse ist Abstrakt.
Im Gegensatz zu C++, Polymorphie funktioniert nur wenn Sie Sie angeben. Für Java, es funktioniert anscheinend die ganze Zeit.
Also ich denke, das abstract-Schlüsselwort oder ein abstraktes Konzept ist einfach, um die komplette Vererbungshierarchie, machen unvollständigen Typen unmöglich zu instanziieren, oder ist die Förderung guter OOP-Praxis? Kann jemand klären, danke.
Ähm, das war der Punkt. Um zu zeigen, dass der Polymorphismus arbeitet ohne Definition eine abstrakte Klasse/Methode. Jungs, ich ' m Lesen Ihre Antworten, danke.
Also deine Frage ist wirklich "Was ist der Punkt, dass konkrete Klassen erweitert werden?". Weil Sie können hinzufügen, zusätzliches Verhalten zu einer bereits implementierten Klasse, oder möchten Sie vielleicht, um das überschreiben der default-Verhalten. Wenn Sie möchten, um verhindern das passiert, dann können Sie mit der letzten - Schlüsselwort in der Klasse, die Sie nicht wollen, erweitert.
Sorry Mann, ich war in der Klasse. Ich glaube, ich verstehe, wo meine Verwirrung resultierte aus. In C++ habe ich fälschlicherweise geglaubt, dass Polymorphismus wurde abhängig auf abstrakte Klassen. Aber das ist falsch. Ich kann die Verwendung der virtual - Schlüsselwort, um Polymorphismus geschehen, sondern um eine abstrakte Klasse musste ich eine rein virtuelle Funktion, einfach weil es keine abstract-Schlüsselwort in C++. Der einzige Unterschied in Java ist Polymorphie ist implizit. Es gibt noch mehr..wenn Sie das Lesen, bitte warten...
Auf Ihre Letzte Frage, für Java, Nein, Polymorphismus ist nicht abhängig von abstrakten Klassen. Sie schreiben, könnte eine code-Basis, die nicht über Schnittstellen oder abstrakte Klassen überhaupt, und es könnte noch polymorph Verhalten. Dies ist eine schlechte Praxis, aber, und im Allgemeinen sollten Sie es vermeiden, die Ausweitung nicht-abstrakten Klassen, wenn Sie können, möglichst zu vermeiden. Sie sollten auch vermeiden, Tiefe Vererbung von Hierarchien wenn Sie können, und bevorzugen implementieren von Schnittstellen zu erweitern, abstrakte Klassen, wenn Sie können.
InformationsquelleAutor Lews Therin | 2011-10-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin nicht sicher, dass Sie verstehen, was eine abstrakte Klasse ist, keine Klasse in deinem Beispiel sind Abstrakt, und nichts in es ist eine Schnittstelle, die entweder. Was Sie tun, ist die Erweiterung einer instanziierbaren Klasse. Ohne die
abstract
Schlüsselwort es gibt nichts zu stoppen Sie tun mir:Ich denke ein besseres Beispiel wäre es, zu verdeutlichen, wie abstrakte Klassen verwendet werden. Was Sie Häufig zu tun ist, um eine gängige Methode der Umsetzung. Wenn eine Anzahl von Klassen implementieren eine Schnittstelle, aber alle von Ihnen implementieren die gleiche Methode auf die gleiche Weise mit dem gleichen code, dann das, was allgemein getan wird, um zu erstellen ein
abstract
Klasse, enthält die gemeinsame Umsetzung, und erhalten Sie alle von der konkrete Implementierungen für die Klasse erweitern. Dies erleichtert die Wiederverwendung von code, und verringert die Wahrscheinlichkeit, dass ein Entwickler ändern die gängige Methode der Umsetzung für eine Klasse, aber vergessen Sie die anderen. Zum Beispiel..Was wir getan haben, ist hier die Einführung eines
abstract
KlasseThing
, die bietet eine Methode, die Umsetzung, die gemeinsam für alle 3 Implementierungen vonSuperObject
(das ist jetzt ein interface). Das heißt, wir haben nicht zu schreiben, den gleichen code wieder in drei verschiedenen Orten, um die volle Umsetzung derSuperObject
- Schnittstelle in allen unseren konkreten Klassen.Darüber hinaus können Sie auch
extend
nichtfinal
Klassen. Möglicherweise möchten dies tun, um das überschreiben der default-Verhalten einer oder Methoden, die auf die konkrete Klasse, oder dekorieren Sie die Klasse weitere Methoden. Natürlich, wenn Sie eine Klasse entwerfen, die Hierarchie von Grund Sie nicht bleiben, konkrete Kurse in it, dann Holen Sie sich erweiterte, die von anderen Klassen, wie es im Allgemeinen als ein bad code smell. Jedoch, nur wenige von uns arbeiten mit völlig neu geschrieben-aus-kratz-codebase und müssen sich anpassen vorhandene Codebasis auf neue Anforderungen. Erweiterung eine konkrete Klasse ist eine Klasse tool in der toolbox, um dies zu tun.EDIT: falsch verstanden, was der OP gefragt wurde, aber der Letzte Absatz oben ist relevant.
Ich bin froh, dass es war!
InformationsquelleAutor Jon
Abstrakte Klassen sind eine hervorragende Möglichkeit zu schaffen, geplante Vererbung Hierarchien. Sie sind auch eine gute Wahl für nicht-Klassen in Klassen-Hierarchien.
Hier ist eine gute ausführliche Erklärung: (extrahiert aus hier)
InformationsquelleAutor Saket
Sie haben auch nicht die Umsetzung bestimmter Methoden in abstrakten Klassen. Sie können entscheiden, welche erklärt werden müssen in Unterklassen und was wollen Sie erklären in der Oberklasse.
Blick auf Ausgabestrom zum Beispiel:
Haben Sie eine abstrakte Methode write (weil Sie nicht das Ding, wo der Ausgabestrom wird), aber alle anderen zusätzliche Methoden schreiben nicht Abstrakt und an diese Methoden. So müssen Sie nur noch erklären, eine Methode in der Unterklasse und haben einige Methoden, die "extra", ohne es zu realisieren in jeder Unterklasse.
InformationsquelleAutor MasterCassim
Möchten Sie vielleicht eine Klasse keine Instanzen.
Beispielsweise angenommen, Sie haben eine Klasse "Person" und zwei Klassen von Ihr abgeleitet Schüler und Lehrer. In diesem Fall können Sie nicht wollen, um irgendwelche Objekte, die aus der Person-Klasse ist, da es nicht irgendeine Bedeutung haben, für Ihr Programm.
InformationsquelleAutor hevi
Lassen Sie uns sagen, Sie wollen eine Anwendung bereitstellen, die auf eine Ipad, Android, Iphone und Desktop Anwendung.
Sie arbeiten an einem wichtigen Teil, das tun 95% der Arbeit in eine abstrakte Klasse. Dann erstellen Sie 4 weitere kleine Klassen, implementieren Sie die abstrakte Methode für jedes Gerät unterschiedlich.
So, Sie nicht wiederholen werde, 95% der Arbeit, und jedes Gerät wird instantiieren seine eigene Klasse erweitert die abstrakte Allgemeine Klasse.
InformationsquelleAutor Nicolas Zozol
Den "Punkt" ist das erzwingen einer Klassen-Hierarchie, möglicherweise einige der Funktionen durch base class(es), und erzwingen Sie einige Verhalten umgesetzt werden sub-Klassen.
InformationsquelleAutor Dave Newton
Verwenden Sie eine abstrakte Klasse, in Fällen, in denen Sie tun angeben möchten, bestimmte Handlungen, aber nicht will, dass jemand instatiate es direkt, aber mit Unterklasse.
InformationsquelleAutor Alexander Rühl
Einer abstrakten Klasse kann voll oder das Skelett für die Unterklasse. Definieren Sie Ihre Vorlage in der abstrakten Klasse und der linken für die Unterklasse zu erweitern und implementieren Sie die Methoden in der Oberklasse definiert.
InformationsquelleAutor gotomanners
Meine Antwort ist ja um alles, was Sie sagte.
InformationsquelleAutor michael667
Zusammen mit dem, was andere gesagt haben, verwenden Sie möglicherweise eine Bibliothek, geschrieben von jemand anderes, wo man keinen Zugriff auf den source code, aber ändern wollen Sie das Verhalten.
InformationsquelleAutor Bradley Uffner