2009-11-20 20 views
8

Da die abstrakte Klasse nicht initialisiert werden kann, warum sind die Konstruktoren erlaubt?C# Zusammenfassung der Klassenklärung

Ich dachte, Incase muss ich Informationen zur Basisklasse (abstrakte Klasse in dieser Klasse) übergeben, ich muss Konstruktor haben. I .. mean

 abstract class Person  
    { 
     string regNo,name; 

     public Person(string regNo,string name) 
     { 
      this.regNo = regNo; 
      this.name = name; 
     } 

     public string RegNo 
     { 
      get { return regNo; } 
     } 

     public string Name 
     { 
      get { return name; } 
     } 

    } 

    class student : Person 
    { 
     student(string regno, string name) 
      : base(regno, name) 
     { 
     } 
    } 

ist dies der Zweck der Konstruktor ist innerhalb der abstrakten Klasse erlaubt?

+0

Wenn kein Mitglied der Basisklasse abstrakt ist, was ist dann der Punkt, an dem die Person abstrakt sein soll? – Benny

Antwort

18

Obwohl es auf eigene nicht instanziiert werden kann, kann eine abstrakte Klasse Konstruktoren haben, die von den Konstruktoren seiner abgeleiteten Klassen aufgerufen würden.

Dies ist besonders nützlich für die Initialisierung der Mitglieder in der Basis selbst enthalten. (d. h. wenn der Konstruktor der abgeleiteten Klasse einen Verweis auf "base()" enthält).

Und tatsächlich, wie Jason Down uns erinnert, hat eine Klasse immer einen parameterlosen Standardkonstruktor zur Verfügung gestellt, wenn solch ein Konstruktor nicht explizit definiert ist.

+2

Vergessen Sie nicht, dass auch für eine abstrakte Klasse automatisch ein Konstruktor ohne Argument generiert wird, wenn Sie nicht selbst einen erstellen. –

2

Udanamehar, Der Hauptgrund, dass ich abstrakt verwende, ist, dass ich diese Entität als etwas identifiziert habe, das ich ziemlich oft wiederverwenden werde. So könnte ich einige Code schreiben wie:

public class Student : Person 
{ 
    public int StudentID { get; protected set; } 

    public Student(int studentID, string regNo,string name) : base(regNo,Name) 
    { 
     this.StudentID = studentID; 
    } 

} 

ich es etwas verbalisieren würde wie „... Alle Schüler sind Personen“ deshalb haben wir ein ‚ist eine‘ Beziehung zu dem klar zum Ausdruck kommt. Ich habe das obige Beispiel nicht wirklich kompiliert und getestet. . aber du hast die Idee.

Hoffe, das hilft. . .

+1

Vielen Dank. –

1

In einem simplen Sinn, sein Programmierer faul, und Faulheit die Tugend der Kreativität und Effizienz zu sein, ich alle Konstruktor Aktivitäten, die für alle abgeleiteten Klassen einer Base/Superklasse möchte in der Basis häufig gestellt werden/Superklasse.

In der folgenden Abbildung wird allen Mitarbeitern Gesundheitsversorgung und Gehalt angeboten, aber nicht alle Mitarbeiter verfügen über die gleiche Expertise.

1

Sie können einen Konstruktor in einer abstrakten Klasse verwenden, um eine spezifische Logik zu implementieren. Beispielsweise würden Sie private Felder in diesem Konstruktor initialisieren, insbesondere wenn sie keine Standardwerte sind, da die abgeleitete Klasse die privaten Felder nicht mehr sehen kann.

Ein Konstruktor mit einem oder mehreren Argumenten in einer abstrakten Klasse kann auch das Verhalten der abstrakten Klasse auf eine bestimmte Weise initialisieren, was wichtig ist. Meistens werden Sie feststellen, dass es empfohlen wird, diese Konstruktorüberladungen in Ihrer abgeleiteten Klasse zu umbrechen.

Was ist in der Tat ein wenig irritierend oder sogar ein Konstruktionsfehler in C# (oder der gesamten .NET CLI möglicherweise) ist, dass Sie ein öffentliches Konstruktor in einer abstrakten Klasse definieren können, wie es immer ist effektiv dann geschützt In diesem Fall. Ich für immer deklariere immer meine abstrakten Klassenkonstruktoren geschützt (oder weniger sichtbar, wenn nötig natürlich).