2017-02-03 219 views
1

我必須編寫一個叫做Vehicle的類,它具有許多屬性(例如大小,座位,顏色等),並且我還有另外兩個類可以編寫自己的屬性TrunkCar與抽象類的接口

所以我寫它:

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

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

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

在那之後,我寫了一個接口:

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

所以我在想,我可以用這樣的:

// 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 

} 

但是,我收到了錯誤:

錯誤CS0738:'CarRepository'沒有實現接口成員'IVehicleRepository.GetAll()'。 'CarRepository.GetAll()'不能實現'IVehicleRepository.GetAll()',因爲它沒有匹配的返回類型'IEnumerable <'Vehicle>'。

那麼,我該怎麼做呢?

回答

7

您的CarRepository未實施該方法。這兩個是不一樣的:

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

這是兩種不同的類型,當你從接口派生你必須精確地實現它。你可以只實現它是這樣的:

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

然而更好的方式是使其成爲一個通用的接口:(缺點是兩個不同的實現再次輸入兩種不同的類型,以便看看那是什麼你想要的)

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

一個更完整的版本:

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)。這幫助了我,但我又遇到了另一個問題。 如果我只有一個存儲庫,我可以在Startup.cs中的「public void ConfigureServices(IServiceCollection services)」中注入它: services.AddSingleton (); 但是,現在我有兩個存儲庫:CarRepository和TrunkRepository(擴展IVehicleRepository)。我現在怎麼注入CarRepository和TrunkRepository? – shibata

+0

@Olavo Shibate - 很高興幫助。如果它幫助您解決具體問題,請考慮標記爲已解決。至於另一個問題 - 政策是後續問題應該在單獨的問題中發佈。請搜索人們遇到的類似問題,您仍然需要幫助,請發佈一個新問題,我們將很樂意幫助 –

+0

當然,謝謝。 – shibata

1

你可以使IVehicleRepository通用:

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

然後你會仍然有一個CarRepositoryIVehicleRepository<Car>TruckRepository將是一個IVehicleRepository<Truck>問題。並且這兩個接口是不同的類型,並且只有在具有正確的variance時才能分配給對方。