与抽象类的接口

时间:2017-02-03 13:35:52

标签: c# interface polymorphism abstract

我必须编写一个名为Vehicle的类,其中包含许多属性(例如大小,座位,颜色......),还有两个要编写的类Trunk和{{1}有自己的属性。

所以我写了:

Car

之后,我写了一个界面:

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

但是,我遇到了错误:

  

错误CS0738:&#39; CarRepository&#39;没有实现接口成员&#39; IVehicleRepository.GetAll()&#39;。 &#39; CarRepository.GetAll()&#39;无法实现&#39; IVehicleRepository.GetAll()&#39;因为它没有匹配的返回类型&#39; IEnumerable&lt;&#39; Vehicle&gt;&#39;。

那么,我该怎么做呢?

2 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分: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>TruckRepositoryIVehicleRepository<Truck>的问题。这两个接口是不同的类型,只有具有正确的variance才能彼此分配。