2017-08-31 2 views
2

In C# möchte ich einige spezialisierte Generika, die nur verwendet werden, um einen bestimmten Typ von einem anderen generischen zurückzugeben. Der spezielle generische Zweck besteht darin, nur einige exakte Typen zu erzwingen, die zurückgegeben werden (wie double, double [], byte, byte []). Wahrscheinlich wird am besten durch ein Beispiel zu erläuternC# Generic mit begrenzten Rückgabetypen

var x = new MyGeneric<MyInterfaceDouble>(); 
double returnVal = x.getVal(); 

var x = new MyGeneric<MyInterfaceMyClass>(); 
MyClass returnVal = x.getVal(); 

So habe ich mehr Möglichkeiten versucht, dies zu erreichen, aber nicht in der Lage, dies zu tun. Die neueste Iteration:

public interface IMyInterface 
{} 

public interface IMyInterface<T, U> :IMyInterface 
{ 
    U getValue(); 
} 

public class MyInterfaceDouble: IMyInterface<MyInterfaceDouble, double>, IMyInterface 
{ 
    public double getValue() 
    { 
     return 8.355; 
    } 
} 

public class MyGeneric<T> where T : IMyInterface 
{} 

Aber ich kann nicht den get zugreifen Wert

var x = new MyGeneric<MyInterfaceDouble>(); 
double returnVal = x.getVal(); // not available 

Wie kann dies gemacht werden?

+0

Methode nicht verfügbar was meinst du, es existiert nicht? Oder geht es um die Schutzstufe? In Ihrer Klassendefinition heißt Ihre Methode: getValue, und Sie rufen getVal auf. das gibt es nicht – Ferus7

+0

@ Ferus7 Ich glaube, der Grund ist, dass MyGeneric nicht IMyInterface generisch erbt, so dass es kein Mitglied hat. Ich habe es auch versucht, indem ich die nicht generische IMyInterfece geerbt habe, aber da es kein Mitglied hat, wird es auch nicht verfügbar sein. – codiac

+0

'MyGeneric ' erbt nicht 'T', noch implementiert es keine Methoden, also nein, Sie werden 'getVal' oder' getValue' für dieses Objekt nicht finden. Bitte erläutern Sie, was Sie hier erreichen möchten, da die Sprache nicht das unterstützt, was Sie hier verlangen. –

Antwort

2

Es scheint, dass Sie einige Änderungen in Ihrem Design haben werden.

Es gibt keine Definition für getVal innerhalb IMyInterface, also ist natürlich nicht verfügbar für MyGeneric<MyInterfaceDouble>.

würden Sie von IMyInterface<T, U> erben statt IMyInterface:

public class MyGeneric<T> where T : IMyInterface<T, SomeSpecialType> 
{} 

ODER

Änderung IMyInterface defination getVal als General zu haben, die wieder object:

public interface IMyInterface 
{ 
    object getValue(); 
} 

OR

ändern MyGeneric<T> Definition dazu:

public interface IMyInterface 
{ } 

public interface IMyInterface<T> 
{ 
    T getVal(); 
} 

public class MyInterfaceDouble : IMyInterface<double>, IMyInterface 
{ 
    public double getVal() 
    { 
     return 8.355; 
    } 
} 

public class MyGeneric<T> where T : IMyInterface 
{ 
    T Obj { get; } 
} 

und wie diese verwenden:

var x = new MyGeneric<MyInterfaceDouble>(); 
double returnVal = x.Obj.getVal(); // available 

Auch gibt es einige andere Lösungen, die auf Ihre Vision ab, die Sie entwerfen möchten.

+0

Wenn MyGeneric IMyInterface nicht ausgeführt. Zweite Version: Das Rückgabeobjekt muss anschließend gecastet werden. – codiac

+0

Die dritte Version ist so nah. Es ist fast perfekt. Dies vereinfacht auch die spezialisierten Generika und die Schnittstelle – codiac