3 Stimmen

Ist es möglich, generische Typen auf Interface, new() zu beschränken?

Ich versuche, eine einfache Objektwiederverwendungsklasse zu erstellen

public class ObjectPool where T : class, IRecyclable, new()
{
}

Ich möchte es mit meinem Interface verwenden können:

public interface ISomeInterface : IRecyclable
{
}

ObjectPool pool = new ObjectPool();

Aber das führt zu dem Fehler:

Error CS0310: Der Typ "ISomeInterface" muss über einen öffentlichen parameterlosen Konstruktor verfügen, um ihn als Parameter "T" im generischen Typ oder in der generischen Methode "ObjectPool" verwenden zu können.

Basierend auf dem, was ich online gelesen habe, weiß ich, dass ich keinen Konstruktor in einem Interface angeben kann.

Ich habe gelesen, dass Sie stattdessen Reflexion verwenden können, um eine neue Instanz zu erstellen, obwohl ich mir über die Geschwindigkeit bei der Ausführung dieser Instanziierung Sorgen mache.

Was ist der richtige Weg, um diese Situation zu lösen? Gibt es eine einfachere Lösung, die ich komplett übersehe?

2voto

Daniel A. White Punkte 180762

Sie können keine Schnittstelle bereitstellen. Klasse und neu erfordern, dass es sich um einen konstruierbaren Referenztyp handelt.

2voto

Timothy Shields Punkte 70194

Schnittstellen können nur andere Schnittstellen implementieren.

interface IA : IB, IC
{
    ...
}

Ein guter Weg, um Ihr Dilemma zu lösen, ist es, auch eine Factory-Schnittstelle einzuführen.

interface IThing
{
    ...
}

interface IThingFactory
{
    IThing Create();
}

Jetzt sollte alles, was die Fähigkeit haben möchte, Dinge zu erstellen, dafür eine IThingFactory erhalten.

Wenn Sie ein generisches Konzept einer Fabrik benötigen, könnten Sie etwas Ähnliches verwenden:

interface IFactory
{
    T Create();
}

class ObjectPool
    where T : IRecyclable        
    where F : IFactory
{
    public ObjectPool(F factory)
    {
        ...
    }
}

0voto

supercat Punkte 72939

Sie können keinen ObjectPool konstruieren. Sie könnten einen generischen Typ MyClass where T:class,ISomeInterface,new() deklarieren und darin einen ObjectPool später deklarieren und dann Variablen vom Typ MyClass deklarieren, aber der Compiler kann nur Methoden für ObjectPool ausführen, wenn T eine bestimmte bekannte Klassentyp ist, der alle Einschränkungen erfüllt.

Alternativ könnten Sie die new Einschränkung weglassen und dann verlangen, dass jeder Code, der einen ObjectPool konstruiert, dem Konstruktor (oder anderen Methode, die die Instanz erstellt) ein Func übergibt. Dadurch wäre es möglich, einen ObjectPool zu erstellen, vorausgesetzt, man hätte eine Methode, die beim Aufruf ein neues Objekt eines geeigneten Typs zurückgeben würde, das ISomeInterface implementiert.

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