2017-07-10 1 views
0

Ich habe eine abstrakte Klasse Generika genannt, wie folgt umgesetzt:Sammlung von Objekten mit gemeinsamer Abstrakte Basisklasse

public abstract class generic 
{ 
    public string creatorID { get; set; } 
    public string itemID { get; set; } 
    public string name { get; set; } 
    public DateTime creationDate { get; set; } 
    public string pageName { get; set; } 
    ... 
} 

Der durch mehrere Klassen implementiert wird, wie zum Beispiel:

public class file : generic 
{ 
    public file(string _itemID, string host, string languageReferenceID) 
    { 
     DataTable dt = GetRecordsFromDatabase(string _itemID, string host, string languageReferenceID); 
     if (dt.Rows.Count > 0) 
      setParameters(dt.Rows[0]); 
     ... 
    } 

    private void setParameters(DataRow dr) 
    { 
     creatorID = dr["f_MemberID"].ToString(); 
     itemID = dr["f_ID"].ToString(); 
     name = dr["f_Name"].ToString(); 
     creationDate = DateTime.Parse(dr["f_DateCreated"].ToString()); 
     pageName = "files"; 
     ... 
    } 
} 

Was ich m zu tun versucht, eine Liste von Objekten verschiedener Instanziierungen dieser abstrakten generischen Klasse zu erstellen. Hier ist, was ich bin versucht zu tun:

public List<generic> getAlerts(string host, string languageReferenceID) 
    {    
     DataTable dt = GetAlertsFromDatabase(host, languageReferenceID); 

     List<generic> alertList = new List<generic>(); 

     foreach (DataRow dr in dt.Rows) 
     { 
      generic g = new generic(); 

      g.itemID = dr["itemID"]; 
      g.description = dr["description"]; 
      g.pageName = dr["pageName"]; 

      g.Add(m); 
     } 

     return alertList; 
    } 

Nun, natürlich ist dies ein Fehler auf der Linie mit Wurf:

generic g = new generic();

Da Generika ist eine abstrakte Klasse, es kann‘ t als Objekt instanziiert werden.

Meine Frage ist - wie erreiche ich mein Ziel, angesichts der Anforderungen, die ich aufgeführt habe? Soll ich eine neue Klasse erstellen, die die abstrakte Klasse generic implementiert, um nur Listen vom Typ generic zu instanziieren? Das scheint für mich eine merkwürdige Lösung zu sein, aber es ist das einzige, woran ich gerade denken kann.

+1

'Was ich versuche zu tun, ist eine Liste von Objekten verschiedener Instanziierungen dieser abstrakten generischen Klasse zu erstellen' Nein, das ist nicht, was dein Code macht. Wenn Sie Ihren Code und Ihre Anforderungen übereinstimmen, haben Sie kein Problem. – SLaks

+4

Sie wollen keine Instanz von 'generic'. Sie möchten eine Instanz einer Unterklasse von 'generic'. Wenn 'getAlerts()' diese 'Liste 'mit mehr als einer anderen Unterklasse füllen könnte, sollte' getAlerts() 'eine Klassenfactory verwenden, die eine' DataRow' betrachtet und entscheidet, welche * Unterklasse * von 'generic' sollte erstellt werden und erstellt es. –

+0

Vielleicht bin ich nicht klar - es gibt viele Klassen, die die abstrakte Klasse generisch implementieren. Datei ist nur einer von ihnen. Mein Datenbankaufruf wird eine Reihe von Zeilen zurückgeben, die verschiedenen Arten von Objekten entsprechen, von denen alle generische implementieren. Ich möchte eine Liste, die alle diese Objekte enthält, und die Liste sollte vom Typ generisch sein. –

Antwort

2

Für mich sieht das wie a class factory aus.

Sie benötigen eine Methode, die eine DataRow nimmt, schaut sich ihre Felder an und entscheidet, welche Unterklasse von generic für diese Zeile erstellt werden soll. Dann erstellt es das entsprechende Objekt newObj, ruft newObj.setParameters(dr) auf und gibt newObj zurück.

Vorzugsweise nimmt die tatsächliche Factory-Methode keine DataRow, sondern nur den einen Skalarwert (int, string, was auch immer), der den Typ angibt, der erstellt werden soll.

Vielleicht wird die Klassenfabrik durch Abhängigkeitsinjektion übergeben; Sie könnten einfach oder ausführlich darauf eingehen.

+1

Danke für die superschnellen Antworten an alle.Ich habe Eds Antwort als Antwort markiert, weil es die Idee ist, von der ich die Idee habe. Als Referenz löste ich die Lösung mithilfe der Activator.CreateInstance-Methode, um eine Instanz der spezifischen Klasse zu erstellen, die generische Instanzen instanziiert, und diese dann wieder in generic eingibt. Vielleicht nicht die sauberste Lösung, aber es funktioniert für meine Zwecke! –

Verwandte Themen