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.

Okay, gut, problem Nummer eins ist, dass keine der Klassen in Ihrem Beispiel erklärt werden als abstrakte. Sie sind alle konkreten Klassen. Ich vermute, dass Sie benötigen, zu formulieren Ihre Frage, da bin ich mir nicht sicher, dass Sie wissen, was der Unterschied ist zwischen einer abstrakten Klasse, einer Schnittstelle und einer nicht-finalen konkrete Umsetzung.
Ä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

Schreibe einen Kommentar