2017-02-03 4 views
1

多くの属性(サイズ、シート、色など)を持つVehicleというクラスを作成する必要があります。また、TrunkCarという独自の属性を持つ2つのクラスを作成する必要があります。抽象クラスとのインタフェース

だから私はそれを書いた:その後

// Vehicle.cs 
abstract public class Vehicle 
{ 
    public string Key { get; set; } 
    ... 
} 

// Car.cs 
public class Car : Vehicle 
{ 
    ... 
} 

// Trunk.cs 
public class Trunk : Vehicle 
{ 
    ... 
} 

を、私はインターフェイスを書いた:

// CarRepository.cs 
public class CarRepository : IVehicleRepository 
{ 
    private static ConcurrentDictionary<string, Car> _cars = 
      new ConcurrentDictionary<string, Car>(); 

    public CarRepository() 
    { 
     Add(new Car { seats = 5 }); 
    } 

    public IEnumerable<Car> GetAll() 
    { 
     return _cars.Values; 
    } 

    // ... I implemented the other methods here 

} 

// IVehicleRepository.cs 
public interface IVehicleRepository 
{ 
    void Add(Vehicle item); 
    IEnumerable<Vehicle> GetAll(); 
    Vehicle Find(string key); 
    Vehicle Remove(string key); 
    void Update(Vehicle item); 
} 

だから私は、私はこのようなものを使用することができることを考えていましたしかし、私はエラーが発生しました:

エラーCS0738: 'CarRepository'は、インターフェイスメンバー 'IVehicleRepository.GetAll()'を実装していません。 'CarRepository.GetAll()'は、 'IEhumerable <' Vehicle> 'という一致する戻り値の型がないため、' IVehicleRepository.GetAll() 'を実装できません。

どうすればいいですか?

答えて

7

CarRepositoryはメソッドを実装していません。これら二つは同じではありません。

  • public IEnumerable<Car> GetAll()
  • IEnumerable<Vehicle> GetAll()

これらは2つのタイプがあり、あなたは、インターフェイスから派生するとき、あなたはまさにそれを実装する必要があります。良い方法は、それの汎用インタフェースにするだろうしかし

public IEnumerable<Vehicle> GetAll() 
{ 
    // Cast your car collection into a collection of vehicles 
} 

::(欠点は、2つの異なる実装が再び入力することで二つの異なるタイプがあるので、それが何であるかどうかを確認あなたはこの方法でそれを実装することができますあなたはIVehicleRepository汎用作ることができる

public interface IVehicleRepository<TVehicle> where TVehicle : Vehicle 
{ 
    void Add(TVehicle item); 
    IEnumerable<TVehicle> GetAll(); 
    Vehicle Find(string key); 
    Vehicle Remove(string key); 
    void Update(TVehicle item); 
} 

public class CarRepository : IVehicleRepository<Car> 
{ 
    private static ConcurrentDictionary<string, Car> _cars = 
      new ConcurrentDictionary<string, Car>(); 

    public CarRepository() 
    { 
     Add(new Car { seats = 5 }); 
    } 

    public IEnumerable<Car> GetAll() 
    { 
     return _cars.Values; 
    } 
} 
+0

ありがとう、みんな(http://stackoverflow.com/users/6400526/gilad-greenとhttp://stackoverflow.com/users/5528593/ren%C3%A9-vogt)。これは私を助けましたが、別の問題があります。 私はリポジトリが1つだけの場合、Startup.csの "public void ConfigureServices(IServiceCollection services)"に注入できます。 services.AddSingleton (); しかし、私はCarRepositoryとTrunkRepository(IVehicleRepositoryを拡張)という2つのリポジトリを持っています。 CarRepositoryとTrunkRepositoryはどのように注入できますか? – shibata

+0

@Olavo Shibate - 助けてくれてうれしいです。特定の問題を解決するのに役立つ場合は、解決済みとしてマークすることを検討してください。もう1つの質問については、フォローアップの質問を別の質問に掲載するというポリシーがあります。人々が持っていた同様の問題を探してください。あなたはまだ新しい質問を投稿してください。私たちは喜んで助けてくれるでしょう –

+0

ありがとうございます。 – shibata

1

:あなたは)

public interface IVehicleRepository<TVehicle> {} 
public class CarRepository : IVehicleRepository<Car> {} 

より完全なバージョンをしたい

public interface IVehicleRepository<T> where T : Vehicle 
{ 
    void Add(T item); 
    IEnumerable<T> GetAll(); 
    Vehicle Find(string key); 
    Vehicle Remove(string key); 
    void Update(T item); 
} 
、その後はこのようなクラスを実装:

public class CarRepository : IVehicleRepository<Car> 
{ 
    private static ConcurrentDictionary<string, Car> _cars = 
      new ConcurrentDictionary<string, Car>(); 

    public CarRepository() 
    { 
     Add(new Car { seats = 5 }); 
    } 

    public IEnumerable<Car> GetAll() 
    { 
     return _cars.Values; 
    } 
} 

をしかし、あなたはその後、まだTruckRepositoryIVehicleRepository<Truck>だろうIVehicleRepository<Car>ながらCarRepositoryがある問題を持っています。そして、これらの2つのインターフェイスはの異なるタイプであり、正しい場合にのみ互いに​​割り当て可能ですvariance

関連する問題