具有接口属性的接口实现

时间:2019-11-07 13:42:24

标签: c# .net interface

我有一个Class,它的一个属性是另一个接口, 像下面的例子一样:

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”。

2 个答案:

答案 0 :(得分:4)

您可以只使用一个类并将这些值传递给其构造函数,而不用为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; }
}

答案 1 :(得分:0)

当您的SUV类实现接口ICar时,它必须实现在该接口中声明的每个属性和功能。因此,您的ICar如下所示:

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

您的SUV至少应如下所示:

class SUV : ICar
{
    public int ID { get; set; }
    public ICarInfo Info { get; set; }
}

当然,您可以在SUV类中添加其他任何属性或功能。

我认为您所期望的是某种继承:由于SUVInfo已经实现了ICarInfo接口,因此您只需声明SUVInfo类型的属性即可。但是C#中的接口实现无法像这样工作。