2017-07-19 7 views
-4

Wir können alles mit Schnittstelle erreichen, für zB - es löst unser Hauptproblem der Mehrfachvererbung, können wir 100% Abstraktion erreichen. dann, was die Notwendigkeit ist eine abstrakte KlasseWarum Abstraktion verwenden, wenn wir Schnittstelle haben

Siehe ich bereits gelesen habe zu verwenden, die abstrakte Klasse erweitert und für zB durch die eng verwandten Klassen verwendet werden können: Kreis erweitert Form usw.

Ich habe auch gelesen, dass eine Schnittstelle kann verwendet werden, um der Klasse eine Funktion hinzuzufügen, wie zum Beispiel vergleichbar, lauffähig, serialisierbar etc.

Also, da wir alles mit Interface machen können (sogar die Dinge, die eine abstrakte Klasse tun kann), was war dann nötig? abstrakte Klassen.

Auch was ist die Verwendung einer nicht abstrakten Methode in einer abstrakten Klasse.

+2

Wurde 1000s mal notiert –

+0

* "Was ist die Verwendung einer nicht abstrakten Methode in einer abstrakten Klasse." * Als Beispiel siehe [Vorlagenmethode Muster] (https://en.wikipedia.org/wiki/ Template_method_pattern) – Andreas

Antwort

0

Abstrakte Klasse ermöglicht es Ihnen, Felder zu definieren so ist es einfach, einige Stateful Basisimplementierung zu implementieren.

In Pre-Java 8 gibt es keine Standardmethoden in Schnittstellen, so dass die einzige Art und Weise, wie Standardmethode Implementierung zur Verfügung zu stellen war abstrakte Klasse zu erstellen.

Da Java 8 können Sie an der Schnittstelle Standardmethoden und statische Methoden definieren, aber noch gibt es keine Felder.

, was die Verwendung eines nicht abstrakte Methode in einer abstrakten Klasse ist

Methoden, die nicht als abstrakt gekennzeichnet sind, können als Standardverfahren in der Standardklasse verwendet werden. Der Grund, warum Sie nicht abstrakte und abstrakte Methoden haben, ist, dass einige Klassenfunktionen (einige Methoden) von der abstrakten Methode abhängen.Hier ein Beispiel:

public class AbstractGreeting { 
    private final String name; 
    protected AbstractGreeting(String name) {this.name = name;} 
    public void displayGreeting() {System.out.println(getGreeting() + " " + name + "!");}   
    protected abstract String getGreeting(); 
} 

Einige concret Implementierungen:

public class HelloGreeting extends AbstractGreeting { 
    public HelloGreeting(String name) { super(name);} 
    @Override protected String getGreeting() { return "Hello"; } 
} 

public class AlohaGreeting extends AbstractGreeting { 
    public AlohaGreeting (String name) { super(name);} 
    @Override protected String getGreeting() { return "Aloha"; } 
} 

Und Nutzung:

HelloGreeting hg = new HelloGreeting("World"); hg.displayGreeting(); 
AlohaGreeting ag= new AlohaGreeting ("World"); hg.displayGreeting(); 

Sure können abstrakte Klassen in die Schnittstelle umgewandelt werden, wenn Sie implementator zwingen Objekts zurückzukehren Zustand. Für abstrakte Beispielklasse kann über neu geschrieben werden als:

public interface Greeting { 
    String getName(); 
    String getGreeting(); 
    default void displayGreeting() {System.out.println(getGreeting() + " " + name + "!");} 
} 

Umsetzung:

public class HelloGreeting implements Greeting { 
    @Override public String getName() {return "World";} 
    @Override public String getGreeting() {return "Hello";} 
} 

Aber manchmal ist es besser, keinen Zugang zu staatlichen Objekt bieten daher abstrakte Klassen könnten in einigen Situationen besser geeignet .

+0

Also, wenn wir einige allgemeine Implementierungen für alle Unterklassen haben, können wir nicht abstrakte Methoden verwenden, um die Wiederholung des Codes in allen Unterklassen, wie displayGreeting() Methode hier – Anshul

+0

@Anshul genau zu vermeiden. – matoni

+0

Vielen Dank @matoni! – Anshul

0

Ich denke, es gibt viele doppelte Fragen wie diese, fand ich this. Ein paar Zitate von e-satis:

Abstrakte Klassen, im Gegensatz zu Schnittstellen, sind Klassen. Sie sind teurer zu verwenden, da es eine Nachschlagefunktion gibt, wenn Sie von ihnen erben. Abstrakte Klassen ähneln stark Schnittstellen, aber sie haben etwas mehr: Sie können ein Verhalten für sie definieren. Es geht mehr um einen Typen, der sagt: "Diese Klassen sollten so aussehen, und sie haben das gemeinsam, also füllt die Lücken aus!".

Kurz gesagt, der Unterschied ist interface und abstract class sind verschiedene Ebenen der Abstraktion. interface ist abstrakter, weil es nur definiert, welche Methoden Sie wie Funktion Signatur in C implementieren müssen. abstract class definiert jedoch das Verhalten von Funktionen weiter. Darüber hinaus können Sie Felder in abstract class definieren, während Sie dies in interface nicht tun können.

Verwandte Themen