首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用接口属性实现的接口

使用接口属性实现的接口
EN

Stack Overflow用户
提问于 2019-11-07 13:42:24
回答 2查看 85关注 0票数 1

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

代码语言:javascript
复制
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的两个实现:

代码语言:javascript
复制
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";
}

我不能使用ICar的实现来实现一个类的ICarInfo,例如:

代码语言:javascript
复制
 public Class SUV : ICar
{
    int ID { get; set; }
    SUVInfo Info { get; set; }
}

SUVInfo是一个ICarInfo,但出现以下错误:

'SUV‘不实现接口成员'ICar.Info’。'SUV.Info‘不能实现'ICar.Info’,因为它没有匹配的返回类型'ICarInfo'.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-07 13:48:17

您可以使用单个类并将这些值传递给它的构造函数,而不是为ICarInfo拥有完全不同的属性值的不同类:

代码语言:javascript
复制
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;
    }
}

这样你根本不需要搞砸不同的类型:

代码语言:javascript
复制
public Class SUV : ICar
{
    int ID { get; set; }
    ICarInfo Info { get; set; } = new CarInfo(new Motor("SUV"), new Wheels("SUV"), "SUV");
}

如果确实需要不同的类,也可以使用泛型:

代码语言:javascript
复制
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; }
}
票数 4
EN

Stack Overflow用户

发布于 2019-11-07 13:52:51

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

代码语言:javascript
复制
interface ICar
{
   int ID { get; set; }
   ICarInfo Info { get; set; }
}

您的SUV必须看起来像这样(至少):

代码语言:javascript
复制
class SUV : ICar
{
    public int ID { get; set; }
    public ICarInfo Info { get; set; }
}

当然,您可以向SUV类添加任何其他属性或函数。

我认为您期望的是某种继承:由于SUVInfo已经实现了ICarInfo接口,所以您只需声明一个类型为SUVInfo的属性。但是C#中的接口实现不是这样工作的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58750040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档