2017-12-01 6 views
4

Ich weiß, dass eine abstrakte Klasse eine besondere Art von Klasse ist, die nicht instanziiert werden kann. Eine abstrakte Klasse darf nur unterklassifiziert (geerbt von) werden. Mit anderen Worten, es erlaubt nur anderen Klassen, von ihm zu erben, kann aber nicht instanziiert werden. Der Vorteil besteht darin, dass bestimmte Hierarchien für alle Unterklassen erzwungen werden. In einfachen Worten, es ist eine Art von Vertrag, der alle Unterklassen zwingt, die gleichen Hierarchien oder Standards zu führen.Standardschnittstellenimplementierungen. Was ist jetzt ein tiefsinniger Unterschied zwischen abstrakter Klasse und Schnittstelle?

Auch ich weiß, dass eine Schnittstelle keine Klasse ist. Es ist eine Entität, die durch das Wort Schnittstelle definiert ist. Eine Schnittstelle hat keine Implementierung; es hat nur die Signatur oder anders gesagt, nur die Definition der Methoden ohne den Körper. Als eine der Ähnlichkeiten zur Klasse Abstract ist es ein Vertrag, der verwendet wird, um Hierarchien für alle Unterklassen zu definieren, oder er definiert bestimmte Methoden und ihre Argumente. Der Hauptunterschied zwischen ihnen besteht darin, dass eine Klasse mehr als eine Schnittstelle implementieren kann, aber nur von einer abstrakten Klasse erben kann. Da C# keine Mehrfachvererbung unterstützt, werden Schnittstellen zum Implementieren der Mehrfachvererbung verwendet.

Wenn wir eine Schnittstelle erstellen, erstellen wir im Grunde eine Reihe von Methoden ohne Implementierung, die von den implementierten Klassen überschrieben werden müssen. Der Vorteil besteht darin, dass es eine Möglichkeit bietet, dass eine Klasse Teil von zwei Klassen ist: eine aus der Vererbungshierarchie und eine aus der Schnittstelle.

Wenn wir eine abstrakte Klasse erstellen, erstellen wir eine Basisklasse mit einer oder mehreren abgeschlossenen Methoden, aber mindestens eine oder mehrere Methoden sind unvollständig und als abstrakt deklariert. Wenn alle Methoden einer abstrakten Klasse unvollständig sind, ist es dasselbe wie eine Schnittstelle.

ABER ABER ABER

ich bemerkt, dass wir ich frage es Standard Interface-Methoden in C# 8.0

Vielleicht, weil ich nur haben 1-2 haben Jahre Erfahrung in der Programmierung, aber was wäre jetzt der Hauptunterschied zwischen der abstrakten Klasse und der Schnittstelle?

Ich weiß, dass wir keinen Zustand in der Schnittstelle machen können, wird es nur ein Unterschied zwischen ihnen sein?

+2

Ehrlich? Sie würden fast identisch werden, während die Pseudo-Mehrfach-Vererbung in C# eingeführt wird. Das ist einer der Hauptgründe, warum viele C# Entwickler (mich selbst eingeschlossen) das Feature komplett ablehnen. –

+1

Ich bemerkte vor kurzem, dass C# 6 abnehmende Renditen in der Programmiersprache Design demonstrieren sollte, und C# 7 sollte zeigen abnehmende Erträge in Demonstrationen von abnehmenden Renditen. Sie können sehen, wohin das mit C# 8 geht. Es entwickelt sich zu einer Art vierdimensionaler Schneekugel. Microsoft muss diese Leute eine neue Sprache finden, an der sie arbeiten können. Dieser ist fertig. Es hat alle Funktionen. –

+3

Eigentlich mag ich wirklich die Idee von nicht-Nullable Referenztypen. –

Antwort

5

Es gibt nicht viel Unterschied zwischen den beiden abgesehen von der offensichtlichen Tatsache, dass abstrakte Klassen Status und Schnittstellen nicht haben können. Standardmethoden oder auch bekannt als virtuelle Erweiterungsmethoden sind tatsächlich seit einiger Zeit in Java verfügbar. Das Hauptlaufwerk für Standardmethoden ist Schnittstelle Evolution was bedeutet, in der Lage, Methoden zu einer Schnittstelle in zukünftigen Versionen hinzufügen, ohne Quelle oder Binärkompatibilität mit vorhandenen Implementierungen dieser Schnittstelle zu brechen.

noch ein paar gute Punkte dieses post erwähnt:

1

Eine andere Sache, die immer noch die Schnittstelle einzigartig macht, ist covariance/contravariance.

Um ehrlich zu sein, fand mich nie in einer Situation, in der eine Standard-Impl. in der Schnittstelle war die Lösung. Ich bin ein bisschen skeptisch.

0

Der einzige Hauptunterschied, der mir in den Sinn kommt, ist, dass Sie immer noch den Standardkonstruktor für abstrakte Klassen überladen können, die Schnittstellen nie haben werden.

abstract class LivingEntity 
{ 
    public int Health 
    { 
     get; 
     protected set; 
    } 


    protected LivingEntity(int health) 
    { 
     this.Health = health; 
    } 
} 

class Person : LivingEntity 
{ 
    public Person() : base(100) 
    { } 
} 

class Dog : LivingEntity 
{ 
    public Dog() : base(50) 
    { } 
} 
Verwandte Themen