2016-09-12 2 views
0

hier zu implementieren ist mein Code:C# - Wie eine nicht generische Schnittstelle in einer generischen Klasse mit Einschränkungen

public interface ICar 
{ 
    CarModel Property { get; set; } 
    CarModel Method(); 
} 

public Car<T> : ICar where T : CarModel 
{ 
    T Property { get; set; } 
    T Method() 
    { 
     //Do Stuff 
    } 
} 

ich die Schnittstelle in meiner Car<T> Klasse mit generischen Einschränkungen umgesetzt haben, aber es läßt sich nicht mit dem folgende Fehlermeldung:

Compilation error (line 18, col 15): 'Car<T>' does not implement interface member 'ICar.Property'. 'Car<T>.Property' cannot implement 'ICar.Property' because it does not have the matching return type of 'CarModel'. 
Compilation error (line 18, col 15): 'Car<T>' does not implement interface member 'ICar.Method()'. 'Car<T>.Method()' cannot implement 'ICar.Method()' because it does not have the matching return type of 'CarModel'. 

ich brauche auch die Schnittstelle nicht generisch zu sein, hier ist eine .Net Geige: https://dotnetfiddle.net/m1jDnB

die einzige Arbeit, um ich habe Dafür muss die Eigenschaft oder Methode mit etwas umschlossen werden, das die Schnittstelle so implementiert, wie sie es will, ABER ich möchte das nicht tun. dh:

public Car<T> : ICar where T : CarModel 
{ 
    T Property { get; set; } 
    T Method() 
    { 
     //Do Stuff 
    } 

    CarModel ICar.Property 
    { 
     get {return Property; } 
     set {Property = (CarModel)value; } 
    } 

    CarModel ICar.Method() 
    { 
     return (CarModel)Method(); 
    } 
} 

Gibt es einen besseren Weg?

+0

Was war der Build-Fehler, sieht aus, als ob Sie die Methode nicht einen Wert zurückgeben. – markmnl

+0

Ist 'Car ' in Ihrem Design erlaubt? ('MyCarModel' erbt von' CarModel') –

+0

@markmnl, tut mir leid, meine Schuld in der Aufschreibung vorgenommen Änderungen wie oben –

Antwort

0

Dies ist nicht möglich. Wenn der Compiler dies zulässt, wäre das Ergebnis nicht typsicher. Wenn die Typen so kompiliert werden konnten, wie Sie es wollten, dann würde dieser Code vom Compiler zugelassen werden.

public class CarModel { 
    public string Name { get; set; } 
} 

public class Toyota : CarModel { 
    public string SpecialToyotaNumber { get; set; } 
} 

public class Honda : CarModel { } 

public interface ICar { 
    CarModel Property { get; set; } 
    CarModel Method(); 
} 

public class Car<T> : ICar where T : CarModel { 
    public T Property { get; set; } 

    public T Method() { 
     return (T)new CarModel(); 
    } 
} 

public class Main { 
    public void Run() { 
     ICar car = new Car<Toyota>(); 
     car.Property = new Honda(); // the concrete property is declared Toyota 
    } 
} 
Verwandte Themen