2016-09-12 10 views
0

とジェネリッククラスの非ジェネリックインターフェイスを実装するためにどのように私のコードです:C#がここで制約

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

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

私は、一般的な制約と私のCar<T>クラスのインターフェイスを実装しているが、それはしてコンパイルされません。次のエラー:https://dotnetfiddle.net/m1jDnB

私が持っているの周りだけの仕事:

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'. 

は、私はまた、非ジェネリックするインターフェースを必要とする、ここでの.Netフィドルですこれはプロパティやメソッドをラップして、それを望むようにインターフェイスを実装するものですが、これをやりたいとは思いません。すなわち:

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(); 
    } 
} 

もっと良い方法がありますか?

+0

ビルドエラーは何ですか、黙示的メソッドが値を返さないようです。 – markmnl

+0

'Car 'はあなたのデザインで許可されていますか? ( 'MyCarModel'は' CarModel'から継承しています) –

+0

@markmnl、申し訳ありません私の書き込みでの誤りは上記のように変更されました –

答えて

0

これはできません。コンパイラがそれを許可していれば、結果は型安全ではありません。型があなたの望むようにコンパイルできるなら、このコードはコンパイラによって許可されます。

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 
    } 
} 
関連する問題