接口作为接口返回类型

时间:2014-03-17 17:19:04

标签: c# windows-phone-8 interface

在我的应用程序中,我使用不同的web api来获取汽车信息。对于我已经实现了ICarService的服务。由于所有这些Api都返回了一些不同的汽车数据,我已经实现了ICar界面,因此每个服务都可以返回自己的汽车类型,但在我的应用程序中我可以使用“通用”ICar。

这是我的实施:

// Car Model
public interface ICar
{
    string Color { get; }
}

public class CarApiA : ICar
{
    public int car_color { get; set; }
    public Color
    {
        get { return this.car_color; }
    }
}


// Service
public interface ICarService
{
    Task<List<ICar>> GetCarsAsync(string search);
}

public class CarApiAService : ICarService
{
    public async Task<List<CarApiA>> GetCarsAsync(string search)
    {
        HttpClient client = new HttpClient();
        var response = await client.GetAsync(url);
        string content = await response.Content.ReadAsStringAsync();

        return  JsonConvert.DeserializeObject<List<CarApiA>>(content);
    }
}

现在我收到错误消息“'CarApiAService'没有实现接口成员'ICarService.GetCarsAsync(string)'。'CarApiAService.GetCarsAsync(string)'无法实现'ICarService.GetCarsAsync(string)',因为它没有匹配的返回类型'System.Threading.Tasks.Task&gt;'。“

我如何使用界面返回界面?如果我的实施想法完全错误,请指导我正确指导。

1 个答案:

答案 0 :(得分:3)

考虑使用IEnumerable代替IList。这允许您使用协变泛型类型:

public async Task<IEnumerable<ICar>> GetCarsAsync(string search)
{
    // ...
    return JsonConvert.DeserializeObject<List<CarApiA>>(content);
}

(当然界面也必须更新......)

public interface ICarService
{
    Task<IEnumerable<ICar>> GetCarsAsync(string search);
}

如果您想知道与泛型类型的协方差,请解释一下:

  • 只有通用接口可以是协变的(不是通用的具体类型,如List<T>
  • 如果泛型类型定义为out(即只读),则接口只能是协变的。这就是为什么IEnumerable<out T>是协变的,但IList<T>不是
  • 的原因

另请参阅Jon Skeet的回答hereEric Lippert's blog