Mögliche Duplikate:
Interface vs Base-Klasse
Schnittstelle oder abstrakte Klasse?
Hallo alle,
Ich denke nur an die abstrakten Klassen und Interfaces, ich weiß, wie sie technisch funktionieren, aber ich verstehe nicht den wirklichen Gebrauch von abstrakten Klassen und Interfaces. Ich meine, warum sollten wir abstrakte Klassen verwenden, wenn wir wissen, dass wir ihr Objekt nicht erzeugen können? Wir müssen diese Klasse sowieso erweitern, um sie zu verwenden, also warum fügen wir nicht alles in die abgeleitete Klasse ein.
Dasselbe gilt für Schnittstellen, wir müssen die Schnittstelle implementieren, also warum legen wir nicht alle Methoden, die in der Schnittstelle definiert sind, in die Klasse, in der wir die Schnittstelle implementieren.
Kann jemand bitte meine Zweifel mit einigen Beispielen klären?
Links bei Stackoverflow
Andere
Beachten Sie auch, dass Sie in C # nur eine Klasse, aber mehrere Schnittstellen erben können. Eine abstrakte Klasse ist eine Teilimplementierung einer Klasse mit wiederverwendbarem Code für mehrere Unterklassen. Eine Schnittstelle ist genau das, eine Schnittstelle zum Objekt für einen bestimmten Zweck.
Ein gutes Beispiel wären Objekte in einem Spiel. Wenn das Objekt Drawable und Collideable ist, haben Sie möglicherweise gewöhnliche Routinen, um das zu handhaben, aber keine gemeinsame Basisklasse. Daher haben Sie die Klasse IDrawable und ICollidable implementieren.
Was tun Sie, wenn mehr als eine abgeleitete Klasse dasselbe abstrakte Verhalten teilt?
Betrachten Sie als Beispiel die Klasse Stream
in .NET.
Ich habe immer abstrakte Klassen als Straßenkarte für abgeleitete Klassen verwendet. Oft werde ich eine Reihe von Klassen haben, die alle ähnlich sind und in der Lage sein werden, Funktionalität zu teilen, aber sie werden alle so unterschiedlich sein, dass sie ihre eigene Klasse brauchen. Daher ist die Basisklasse nicht voll funktionsfähig und es gibt einige Methoden, die für diese spezielle Klasse entwickelt wurden. Indem Sie es also als abstrakt deklarieren, fügen Sie die Funktionalität in den Namespace zur allgemeinen Verwendung ein, aber Sie können ihre Verwendung immer noch auf diese Gruppe von Klassen beschränken.
Interfaces (für mich) sind nichts weiter als eine Blaupause. Ich habe nie eine Schnittstelle BENÖTIGT, aber beim Veröffentlichen einer erweiterbaren API oder beim Erstellen eines Frameworks innerhalb einer Organisation sind Schnittstellen gute Blaupausen dafür, wie sich erweiterbare Klassen verhalten sollten. Es hilft bei der Definition eines Standards innerhalb des Namespace für die Funktionalität, die von einem bestimmten Satz von Objekten erwartet wird.
Ich würde sagen, dass beides nicht unbedingt notwendig ist, aber sie sind enorm hilfreich, um Ihren Code zu trennen und zu definieren, wie er verwendet und / oder erweitert werden sollte.
In meiner Arbeit verwende ich Schnittstellen, wenn ich Plugins für bestimmte Arten von Komponenten erstellen möchte, die von der Anwendung identisch behandelt werden müssen, aber ihr Verhalten ist komponentenspezifisch. In anderen Fällen wollte ich ein allgemeines Verhalten unter abgeleiteten Klassen, also verwende ich eine abstrakte Klasse, um die Methoden zu definieren, die die abgeleiteten Klassen implementieren müssen, aber dann muss ich nur komponentenspezifische Verhaltensweisen implementieren, wenn es notwendig ist.
>Interface bedeutet, dass Sie Methoden definieren können, die eine Klasse implementieren soll, ohne sie tatsächlich zu implementieren. Ein Beispiel dafür, warum dies nützlich wäre, ist, dass Entwickler Plugins für Ihre Anwendung schreiben können.
Es muss klar sein, welche Methoden in diesem Plugin aufgerufen werden können (wie zB load, unload execute), aber wie diese Methoden implementiert werden, hängt vom Plugin selbst ab. Zum Zeitpunkt des Entwurfs der Schnittstelle haben Sie möglicherweise keine Ahnung, was der Code für diese Methoden tatsächlich ist.
Soweit abstrakte Klassen, obwohl ähnlich, werden normalerweise als Grundlage für ähnliche Klassen verwendet. Im Falle der Stream-Basisklasse hat sie eine Methode zum Lesen eines Blocks von Bytes, die sie ausführen kann, indem sie wiederholt eine Methode aufruft, um ein einzelnes Byte aufzurufen. Wenn Sie mehrere Klassen haben, die von dieser Basisklasse abgeleitet sind, müssen Sie diesen Code nicht in jeder Klasse wiederholen. Daher werden oft abstrakte Klassen verwendet, um die Codeverdopplung zu reduzieren.
Im einfachsten Fall verwenden Sie die abstrakte Klasse, um die Vererbung wie Car von Vehicle zu erben. In der Regel erben Sie auch einige Implementierungs- oder Klassendefinitionen.
Die Schnittstelle wird verwendet, um Typen zu modellieren, die eine ähnliche Teilmenge des Verhaltens, aber nicht notwendigerweise eine Beziehung haben. Beispiel wird sein, ich kann eine Schnittstelle IValidate haben, die eine Methode Validate hat und dies kann durch Auto, Student, Konto oder etc implementiert werden, um für die Daten zu validieren, die sie halten. Diese Typen können nicht wirklich modelliert werden, wie es ist - eine Beziehung
Interface wird auch häufig in einer Sprache verwendet, die keine Mehrfachvererbung als Workaround unterstützt. Andere Verwendungen umfassen die Trennung von Abhängigkeiten und die Bereitstellung von Diensten in COM und WCF.
Tags und Links c#