2015-11-10 9 views
5

Ich möchte eine Basisklasse Student mit einer Methode changeName innerhalb davon erstellen. Ich möchte studentclasses abgeleitet von der Basisklasse Student, wie collegestudent usw. Ich möchte in der Lage sein, die Namen der Schüler zu ändern.C# -Methode: Gibt es einen Parameternamen, um 'abgeleiteten Klassennamen' generisch einzufügen?

Ich habe diesen Code:

public abstract class Student 
{ 
    public virtual void changeName(CollegeStudent s, string name) 
    { 
     s.firstName = name; 
    } 

    public abstract void outputDetails(); 
} 

public class CollegeStudent : Student 
{ 
    public string firstName; 
    public string lastName; 
    public string major; 
    public double GPA; 

    public override void outputDetails() 
    { 
     Console.WriteLine("Student " + firstName + "); 
    } 
} 

Ich möchte wissen, wenn ihr möglich, die öffentlichen virtual void Change Parameter auf einen generischen Parameter zu ändern, jede abgeleitete Klasse von Studenten akzeptiert.

Ist das in C# möglich?

(etwas wie folgt aus:. Public virtual void Change (Anyderivedclass s, string name)

+0

Ja, Sie können Generika in C# dafür verwenden –

+0

Ihr ** Vorname **, ** Nachname ** sollte auch in der Basisklasse sein. Das wäre eine bessere Struktur, weil jeder Student mindestens einen Namen hat – Shaharyar

+0

Danke Jungs. Dhaval Patel: Wie würde ich das in diesem Beispiel anwenden? – Developerdeveloperdeveloper

Antwort

7

Wenn Sie Ihr Design ein wenig geändert haben, würde die Dinge viel einfacher werden. Es scheint so, als ob Sie von einem Java-Hintergrund kommen. Sehen wir uns an, wie C# Ihren Code verbessern kann.

Zuerst, nehmen Sie die FirstName/LastName Felder und verschieben Sie sie in die Basisklasse, wie jede Schülerregistrierung muss diese sowieso liefern. Zweitens hat C# eine Funktion namens Properties (speziell hier können wir Auto-Implementierte Eigenschaften verwenden, da wir keine Validierung benötigen), was im Grunde syntaktischer Zucker für get/set-Methoden ist. Sie können Sie Schüler-Klasse neu erstellen wie folgt aussehen:

public abstract class Student 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

Dies wird jede Instanz eines derive Klasse ermöglichen, die Vorname und Nachname Eigenschaften zu ändern, ohne zusätzliche Methoden ergänzt:

void Main() 
{ 
    var student = new CollegeStudent(); 
    student.FirstName = "Yuval"; 
} 

Im Allgemeinen sollte jede Instanzmethode für das Objekt, das Sie erstellen, nicht ihren eigenen Typ akzeptieren, um sich selbst zu mutieren.

+0

Danke für Ihre Eingabe! Dies scheint die beste Lösung für das logische Problem zu sein, das ich vorgestellt habe. – Developerdeveloperdeveloper

+0

@ user3655413 Sie sind willkommen. –

5

Aber Change() ist eine Instanzmethode Ihrer abstrakten Schüler Warum sind vorbei Sie in einer Instanz eines seiner Derivate als eines davon die Parameter?

Warum brauchen Sie Generika? es sollte so einfach sein ...

public abstract class Student 
{ 
    public abstract void changeName(string newName); 

    public abstract void outputDetails(); 
} 

public class CollegeStudent : Student 
{ 
    public string firstName; 
    public string lastName; 
    public string major; 
    public double GPA; 

    public override void changeName(string newName) 
    { 
      firstName = newName; 
    } 

    public override void outputDetails() 
    { 
     Console.WriteLine("Student " + firstName + "); 
    } 
} 

Und in der Tat (wie erwähnt) die Anwesenheit von Change() in der Basisklasse legt nahe, dass die Namenseigenschaften zum b gehören Ase Klasse, so sollte es wie folgt sein ...

public abstract class Student 
{ 
    public string firstName; 
    public string lastName; 

    public virtual void changeName(string newName) 
    { 
     firstName = newName; 
    } 

    public abstract void outputDetails(); 
} 

public class CollegeStudent : Student 
{ 
    public string major; 
    public double GPA; 

    public override void outputDetails() 
    { 
     Console.WriteLine("Student " + firstName + "); 
    } 
} 
+0

Danke für Ihre Antwort! – Developerdeveloperdeveloper

Verwandte Themen