2017-12-18 6 views
-1

Ich lerne die Konzepte der objektorientierten Programmierung. Einer von ihnen ist die Abstraktion. Ich verstehe, dass jede Klasse, die eine abstrakte Methode enthält, ebenfalls abstrakt sein sollte und dass eine abstrakte Klasse nicht instanziiert werden kann. Um eine abstrakte Klasse zu verwenden, muss ich sie von einer anderen ableiten.Verwendung von abstrakten Methoden und Klassen unklar

So weit so gut. Lassen Sie uns den folgenden Code nehmen:

public abstract class Games { 

    public abstract void start(); 

    public void stop(){ 
     System.out.println("Stopping game in abstract class"); 
    } 
} 

class GameA extends Games{ 
    public void start(){ 
     System.out.println("Starting Game A"); 
    } 
} 

class GameB extends Games{ 

    public void start(){ 
     System.out.println("Starting Game B"); 
    } 
} 

Und dann haben wir eine Klasse mit einer main Methode:

public class AbstractExample { 

    public static void main(String[] args){ 
     Games A = new GameA(); 
     Games B = new GameB(); 

     A.start(); 
     A.stop(); 

     B.start(); 
     B.stop(); 
    } 
} 

Aber ich in der Klasse die folgenden geschrieben haben könnte Games:

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

Dann es müsste nicht abstract sein, die Ausgabe wäre die gleiche und ich wäre sogar in der Lage, die Games Klasse zu instanziieren. Was also ist der Schlüssel für abstrakte Methoden und Klassen?

+1

Es gibt eine [gute Erklärung] (https://softwareengineering.stackexchange.com/questions/96947/why-should-i-declare-a-class-as-an-abstract-class) auf dem Software-Engineering-Stack . – azurefrog

+1

Wenn Sie sich einen Grund vorstellen können, "Spiele" zu einer konkreten Klasse zu machen, dann sollten Sie diese Methode auf jeden Fall umsetzen. Abstraktion ist für Klassen, für die es keinen Sinn hätte, Instanzen von. – jsheeran

+0

Fragen Sie sich, ob die Methode 'start()', wie Sie vorschlagen, Sinn ergibt, wenn nicht, deshalb können Sie sie als abstrakt kennzeichnen: wenn es keinen Sinn ergibt, eine Dummy-Implementierung bereitzustellen und absolut klar zu machen, dass Klassen ** müssen ** es implementieren. –

Antwort

1

Richtig, also in gewissem Sinne abstrakte Klasse/Schnittstellen sind Verträge, die Sie benötigen, um Ihre eigene Umsetzung des Vertrags bereitzustellen. Zum Beispiel schreiben Sie eine Logging-Bibliothek, die in eine Datei, Datenbank usw. schreiben kann. Überlegen Sie, wie Sie jemanden beauftragen würden, die Funktionalität zu implementieren, um auf dem zugrunde liegenden io zu bestehen. Um dies zu erreichen, machen Sie Ihren Code so, dass er mit einer Instanz Ihrer Schnittstelle/abstrakten Klasse arbeitet. Jetzt ist der Unterschied zwischen diesen beiden so einfach wie Schnittstellen keine Implementierung haben. Nun, bis Java 8, aber vergiss es, das ist nichts, was ATM angeht. Ihre abstrakte Klasse kann bestimmte Methoden implementiert haben. Dies kann beispielsweise der Fall sein, wenn Ihr Schreibversuch fehlgeschlagen ist. Aber die eigentliche Schreiboperation wird nur in derjenigen existieren, die sie implementiert. Die Schnittstelle kann nicht.

0

Abstrakte Klassen sind bei einem einzelnen Programmiererprojekt nicht sinnvoll. Sie können sie als eine Verpflichtung sehen, die der Programmierer erwirbt, der von dieser Klasse der Implementierung einiger Methoden erbt.

+0

Auch in einem einzelnen Programmiererprojekt sind abstrakte Klassen sinnvoll, sie sind eine Verhaltensvorlage, bei der die implementierende Unterklasse die Lücken ausfüllt. –

+0

Warum würdest du dir das antun? :) – Andres

+0

Warum nicht? Es macht es nicht "härter" und es bietet eine Art von Selbstdokumentation, die hilfreich sein kann, wenn Sie diesen Code Monate, wenn nicht Jahre später, erneut aufrufen. –

Verwandte Themen