3 Stimmen

Fehlender Konstruktor in einer Klasse abgeleitet von einer generischen Klasse

Ich versuche, basierend auf diesem Beitrag ein generisches LINQ-TO-SQL-Repository zu erstellen, das es im Grunde ermöglicht, eine generische Basisklassen-Repository-Klasse zu definieren, und dann kannst du alle deine tatsächlichen Repository-Klassen definieren, indem du von der generischen Basisklasse abgeleitet wirst.

Ich möchte die Möglichkeit haben, ein Repository mit oder ohne Übergabe des Datenkontexts zu verwenden, deshalb habe ich beschlossen, zwei Konstruktoren in der generischen Basisklasse zu erstellen:

public abstract class GenericRepository
        where T : class
        where C : System.Data.Linq.DataContext, new()
    {
        public C _db;

        public GenericRepository()
        {
            _db = new C();
        }

        public GenericRepository(C db)
        {
            _db = db;
        }

        public IQueryable FindAll()

    ... und andere Repository-Funktionen
   }

Um es zu verwenden, würde ich meine tatsächliche Repository-Klasse ableiten:

public class TeamRepository : GenericRepository { }

Jetzt, wenn ich versuche, dies mit einem Parameter zu verwenden:

AppDataContext db = new AppDataContext();
TeamRepository repos=new TeamRepository(db);

erhalte ich den Fehler: 'App.Models.TeamRepository' enthält keinen Konstruktor, der 1 Argumente akzeptiert

Es scheint also, dass man in C# keine Konstruktoren vererben kann. Wie würdest du dies also kodieren, sodass ich sowohl TeamRepository() als auch TeamRepository(db) aufrufen kann?

6voto

Jeff Mercado Punkte 120818

Abgeleitete Klassen erben nicht automatisch die Konstruktoren einer Basisklasse, Sie müssen sie explizit definieren.

public class TeamRepository : GenericRepository
{
    public TeamRepository() : base() { }
    public TeamRepository(AppDataContext db) : base(db) { }
}

Beachten Sie jedoch, dass wenn die Basisklasse (implizit oder explizit) einen zugänglichen Standardkonstruktor definiert, Konstruktoren der abgeleiteten Klasse ihn implizit aufrufen werden, es sei denn, der Konstruktor wird explizit aufgerufen.

1voto

Kirk Woll Punkte 72923

Du hast recht, Konstruktoren in C# werden nicht in die Subklassen weitergeleitet. Du musst sie selbst deklarieren. In deinem Beispiel musst du zwei Konstruktoren für jedes deiner Repositories zur Verfügung stellen.

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