首页 > 解决方案 > 使用接口属性实现接口

问题描述

我有一个类,它有一个属性是另一个接口,如下例所示:

public interface ICar
{
    int ID { get; set; }
    ICarInfo Info { get; set; }
}

public interface ICarInfo
{
    Motor Motor { get; set; }
    Wheels Wheels { get; set; }
    String Category{ get; set; }
}

ICarInfo 的两个实现:

public Class SUVInfo : ICarInfo
{
    Motor Motor { get; set; } = new Motor("SUV");
    Wheels Wheels { get; set; } = new Wheels("SUV");
    String Category{ get; set; } = "SUV";
}

public Class CompactInfo : ICarInfo
{
    Motor Motor { get; set; } = new Motor("Compact");
    Wheels Wheels { get; set; } = new Wheels("Compact");
    String Category{ get; set; } = "Compact";
}

我无法使用 ICarInfo 的实现来实现一类 ICar,如示例:

 public Class SUV : ICar
{
    int ID { get; set; }
    SUVInfo Info { get; set; }
}

SUVInfo是ICarInfo,但是出现如下错误:

“SUV”没有实现接口成员“ICar.Info”。“SUV.Info”无法实现“ICar.Info”,因为它没有匹配的“ICarInfo”返回类型。

标签: c#.netinterface

解决方案


ICarInfo您可以只使用一个类并将这些值传递给它的构造函数,而不是为它们的属性值不同而使用不同的类:

public class CarInfo : ICarInfo {
    Motor Motor { get; set; }
    Wheels Wheels { get; set; }
    String Category{ get; set; }

    public CarInfo(Motor motor, Wheels wheels, string category)
    {
        this.Motor = motor;
        this.Wheels = wheels;
        this.Category = category;
    }
}

这样,您根本不需要弄乱不同的类型:

public Class SUV : ICar
{
    int ID { get; set; }
    ICarInfo Info { get; set; } = new CarInfo(new Motor("SUV"), new Wheels("SUV"), "SUV");
}

如果你真的想要不同的类,你也可以使用泛型:

public interface ICar<T> where T: ICarInfo
{
    int ID { get; set; }
    T Info { get; set; }
}

public interface ICarInfo
{
    Motor Motor { get; set; }
    Wheels Wheels { get; set; }
    String Category{ get; set; }
}
public Class SUVInfo : ICarInfo
{
    Motor Motor { get; set; } = new Motor("SUV");
    Wheels Wheels { get; set; } = new Wheels("SUV");
    String Category{ get; set; } = "SUV";
}

public Class SUV : ICar<SUVInfo>
{
    int ID { get; set; }
    SUVInfo Info { get; set; }
}

推荐阅读