4 Stimmen

Kann mir jemand einen Link zu einem Code, wo es eine fantastische oder eine schöne Verwendung von Vererbung

Ich bin fest davon überzeugt, dass das Lesen von Code und das Lesen von gutem Code der Schlüssel zu großartiger Programmierung ist. Wenn nicht einer der vielen.

Ich hatte einige Probleme mit der Visualisierung und einem "Gefühl" für die Verwendung von Vererbung, um meine Code-Architektur zu verbessern.

Kann jemand mir einige Link zu guten Code zu emulieren, wo Leute haben Vererbung in einem absoluten "kung-fooey rücksichtslos" Weise [auf eine gute Art und Weise] verwendet

1voto

Captain Sensible Punkte 4637

Ein Beispiel für eine gute Nutzung der Vererbung sind die Klassen des .NET Frameworks. Sie können das MONO-Projekt herunterladen, um Zugang zu einem Teil des Quellcodes zu erhalten. Wenn Sie Ihre Code-Architektur verbessern wollen, sollten Sie etwas Zeit in das Studium von architektonischen Entwurfsmustern investieren.

1voto

KP. Punkte 12720

Hier ist ein persönliches Beispiel, bei dem ich die Vererbung genutzt habe, um eine Entwicklungssituation erheblich zu verbessern:

Ich brauchte, um ein asp.net (c#) Formular-Steuerelement zu entwickeln, die sowohl Standard-Web-Formulare (Bündel von Formularfeldern mit Schaltfläche "Senden"), als auch eine sichere Version, die Gespräche mit einem Web-Service, um die Informationen über SSL zu übermitteln würde.

Aufgrund der vielen Ähnlichkeiten zwischen den Kontrollen und Konzepten habe ich eine Reihe von Klassen entwickelt:

BaseWebControl

  • benutzerdefinierte Basissteuerklasse, die erbt von System.Web.UI.WebControl Klasse (Teil des .NET-Frameworks
  • hat benutzerdefinierte Eigenschaften und Methoden, die in unserer Anwendung von allen benutzerdefinierten Steuerelementen verwendet werden (Informationen über den Zustand des Steuerelements usw.)

BaseFormControl

  • erbt von BaseWebControl und erhält damit alle seine zugrunde liegenden Funktionen
  • behandelt die Basisfunktionalität von Formularen, wie z. B. das dynamische Hinzufügen von Feldern, das Markieren von Pflichtfeldern, das Hinzufügen der Schaltfläche "Senden" usw. usw.
  • enthält eine Bezeichnung und einen zugehörigen Kontrollindex zum einfachen Nachschlagen
  • als abstrakte Klasse gekennzeichnet, mit einer abstrakten Methode namens SubmitForm . Diese Methode ist in dieser Klasse nicht definiert, wird aber durch das Klick-Ereignis der Submit-Schaltfläche aufgerufen. Das bedeutet, dass jede spezifische Formularsteuerklasse, die von dieser Basisklasse erbt, die abstrakte Methode SubmitForm Funktionalität nach Bedarf.

EmailFormControl

  • Erbt von BaseFormControl so dass alle oben genannten grundlegenden Funktionen ohne Duplizierung zur Verfügung stehen.
  • enthält sehr wenig, außer der Überschreibung der abstrakten Methode SubmitForm und erstellt eine E-Mail auf der Grundlage der Formularfelder.
  • Alle anderen Kontrollfunktionen und die Ereignisbehandlung werden von der Basisklasse übernommen. Wenn in der Basisklasse die Schaltfläche "Submit" angeklickt und behandelt wird, ruft sie diese spezielle Implementierung von SubmitForm

SecureFormControl

  • wiederum erbt von BaseFormControl so dass alle oben genannten Funktionen ohne Duplizierung zur Verfügung stehen.
  • Bei der Umsetzung von SubmitForm stellt er eine Verbindung zu einem WCF-Webdienst her und übergibt die Informationen über SSL.
  • keine weiteren Funktionen erforderlich sind, da die Basisklasse den Rest übernimmt.

Die Grundzüge des Codes sehen wie folgt aus:

public class BaseWebControl : System.Web.UI.WebControl
{
    //base web control with application wide functionality built in
}

public abstract class BaseFormControl : BaseWebControl
{
    //handles all 'common' form functionality
    //...
    //...

    //event handler for submit button calls abstract method submit form, 
    //which must be implemented by each inheriting class
    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        SubmitForm();
    }

    protected abstract SubmitForm();
}

public class EmailFormControl : BaseFormControl
{
    protected override SubmitForm()
    {
        //implement specific functionality to email form contents

    }
}

public class SecureFormControl : BaseFormControl
{
    protected override SubmitForm()
    {
        //connect to WCF web service and submit contents
    }
}

Dies ist das Ergebnis der obigen Ausführungen, BaseFormControl hat etwa 1000 Zeilen Code in einer ganzen Reihe von Methoden, Eigenschaften usw. SecureFormControl y EmailFormControl haben jeweils etwa 40 Zeilen. Alle anderen Funktionen werden von der Basisklasse gemeinsam genutzt und gesteuert. Dies fördert:

  • Wartbarkeit
  • Effizienz
  • Flexibilität
  • Konsistenz

Jetzt kann ich jede Art von Webformular erstellen, z. B. DataBaseFormControl usw. usw. sehr leicht. Ich kann allen Formularen großartige neue Funktionen hinzufügen, indem ich Methoden und Eigenschaften zu den Basisklassen hinzufüge, usw.

Und die Liste geht weiter.

Puh, das war eine Menge Tipparbeit. Ich hoffe, das hilft Ihnen, ein gutes Beispiel zu geben. Dies war ein Beispiel, bei dem ich die Vererbung als Schlüssel zum Erfolg in einem Projekt empfand.

1voto

Dan Bryant Punkte 27022

Ich stimme der Empfehlung zu, sich die .NET-Basisklassenbibliothek anzusehen, da sie hervorragende Beispiele für Abstraktion durch Vererbung und Schnittstellen enthält. Das Ziel ist es, den Code der Verbraucher davon abzuhalten, sich um die Details einer bestimmten Implementierung kümmern zu müssen. Der WinForms-Designer arbeitet mit Steuerelementen, aber er hat keine Ahnung, welche spezifischen Arten von Steuerelementen implementiert werden. Das ist auch egal, denn die Vererbung abstrahiert von den unnötigen Details. LINQ arbeitet in ähnlicher Weise mit IEnumerable; es spielt keine Rolle, was aufgezählt wird, da es Algorithmen gibt, die mit jeder Aufzählung funktionieren. Beides sind hervorragende Beispiele für gut genutzte Abstraktion.

1voto

er-v Punkte 4325

Ich bin fest davon überzeugt, dass das Lesen von Code und das Lesen von gutem Code der Schlüssel zu großartiger Programmierung ist.

Dem kann man kaum widersprechen.

Eigentlich ist die Frage ziemlich schwer - denn es gibt einige Alternativen zur Vererbung, wie z.B. das Prinzip der zusammengesetzten Wiederverwendung, so dass es manchmal sehr schwer zu entscheiden ist, ob die Vererbung auf "kung-fooey rücksichtslose" Art und Weise verwendet wird oder ob es einen besseren Weg gibt, dasselbe zu implementieren, der den Code verständlicher macht/testet/verloren gekoppelt macht und so weiter. Meiner bescheidenen Meinung nach ist der Enterprise Library Application Validation Block mit seinem Microsoft.Practices.EnterpriseLibrary.Validation.Validator Klasse mit all ihren Abkömmlingen ist ein sehr gutes Beispiel für Vererbung, denn

  • Das Konzept der Validierung ist leicht zu verstehen.
  • es gibt ein gutes Beispiel dafür, wie man Gemeinsamkeiten in Objekten mit ziemlich unterschiedlicher Natur finden kann (z.B. OrCompositeValidator/DateTimeRangeValidator/ObjectCollectionValidator)
  • viele von uns haben versucht, etwas mehr oder weniger Ähnliches zu implementieren, so dass dieser Hintergrund mehr Qualität für das Verständnis bietet
  • das ist klar (für mich, aber ich kann mich irren:), dass die Vererbung dort keine Alternativen hat

Sie können den Quellcode von Codeplex herunterladen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X