2016-08-06 3 views
-1

Ich habe eine Klasse, die WrapperBase<PocoBase> POCO Objekte wickelt und bietet zusätzliche Funktionalität:Wie kann ich BaseType <any> angeben?

public class WrapperBase<T> 
where T : PocoBase 

und mehrere Implementierungen oben auf dieser Basisklasse.

public class ButtonWrapper : WrapperBase<Button> 
public class ZipperWrapper : WrapperBase<Zipper> 

Ich versuche, eine Klasse zu schreiben, die eine WrapperBase<T> als Konstruktor Parameter übernimmt.

public class ThingDoer 
    where T : PocoBase 
{ 
    public ThingDoer(WrapperBase<T> wrapper) 
    { 
    } 
} 

aber egal was ich versuche, will die ThingDoer eine Definition für T:

new ThingDoer<Zipper>(zipperWrapper); 
// I don't care what T is... get rid of <Zipper> 

Wie kann ich sagen: „Ich interessiere mich nicht, was T ist, weil all die Funktionalität, die ich will, ist in WrapperBase "?

+1

Wenn mit Generika arbeiten, müssen Sie sich vorstellen, dass die '' <' and '> sind nur ein Teil des Namens. Stell dir für eine Sekunde vor, dass du deine zwei Klassen als 'public class ButtonWrapper: WrapperBase_Button' und' public class ZipperWrapper: WrapperBase_Zipper' definiert hast, denke noch einmal über deine Frage nach, du kannst 'WrapperBase' nicht einfach machen, weil du keine Klasse hast Mit dem Namen 'WrapperBase' haben Sie zwei Klassen namens 'WrapperBase_Button' und' WrapperBase_Zipper', die überhaupt nichts miteinander zu tun haben, außer dass sie die gleichen ersten 12 Buchstaben in ihrem Namen haben. –

Antwort

2

Wie kann ich sagen: "Es ist mir egal, was T ist, weil alle Funktionen, die ich will, in WrapperBase sind"?

Sie könnten eine Schnittstelle definieren IWrapperFunctionality, die die Methoden angibt, die diese Funktionalität bereitstellen. Lassen Sie WrapperBase<T> diese Schnittstelle implementieren, und verwenden Sie sie als Ihr Konstruktorargument.

public ThingDoer(IWrapperFunctionality wrapper) 
{ 
}