C#接口强制属性是另一个接口?

时间:2013-06-24 16:32:12

标签: c# interface inheritance

鉴于此代码:

public interface ITagModel { }

public interface ITemplate {
    ITagModel Model { get; set; }
}

public class EmailTag : ITagModel { }

public class EmailTest : ITemplate {
    public EmailTag Model { get; set; }
}

我被告知EmailTag的类型(EmailClass内)无法实现属性Model,因为它不是ITagModel类型。

它继承了ITagModel ....所以为什么这不起作用?我能做些什么来完成我正在寻找的东西?

2 个答案:

答案 0 :(得分:5)

C#不支持covariant return

e.g。

public class Base { }
public class Derived : Base { }

public class Component
{
    public virtual Base GetComponent()
    {
        return new Base();
    }
}

public class DerviedComponent : Component
{
    public override Dervied GetComponent()
    {
        return new Derived();
    }
}

因此,您需要抽象返回类型并将其约束到您的界面。这样任何实现都需要提供ITagModel

public interface ITagModel { }

public interface ITemplate<TModel>
    where TModel : ITagModel
{
    TModel Model { get; set; }
}

public class EmailTag : ITagModel { }

public class EmailTest : ITemplate<EmailTag> {
    public EmailTag Model { get; set; }
}

答案 1 :(得分:2)

听起来你的ITemplate界面应该是通用的:

public interface ITemplate<TModel> where TModel : ITagModel
{
    TModel Model { get; set; }
}

然后:

public class EmailTest : ITemplate<EmailTag>
{
    public EmailTag Model { get; set; }
}

想象一下,如果您当前的代码有效。然后我可以写:

ITemplate template = new EmailTest();
template.Model = new SomeOtherModel();

......你不会想那样的。 (基本上,你违反了类型安全。)