C#实现具有接口属性的接口。

时间:2015-06-09 19:39:32

标签: c#

我首先使用EF代码来生成我的数据库,并且我确实需要用于IC实体模型的ICollection的具体属性。我正在编写一个数据访问层(使用泛型类)但是使用我的泛型类中的接口来命中以下路障,如下所示。

public interface ITestClassProp
{
    int Value { get; set; }
}

public class TestClassProp : ITestClassProp
{
    public int Value { get; set; }
}


public interface ITestClass
{
    ICollection<ITestClassProp> TestProp { get; set; }
}

public class TestClass : ITestClass
{
    // works
    //public ICollection<ITestClassProp> TestProp { get; set; }
    // does not work
    public ICollection<TestClassProp> TestProp { get; set; }
}

我是否完全误用了界面?为什么我不能使用TestClassProp而不是ITestClassProp?

由于

3 个答案:

答案 0 :(得分:3)

实现接口时,必须使用相同的签名实现该接口的方法/属性。由于界面声明ICollection<ITestClassProp> TestProp { get; set; },因此您的TestClass也必须声明ICollection<TestClassProp> TestProp { get; set; }

这是必要的原因是其他知道接口而不是具体类的类期望属性为ICollection<ITestClassProp>而不是ICollection<TestClassProp>

答案 1 :(得分:0)

简单地说,接口声明了ICollection类型的属性,但是您将其实现为ICollection,它具有完全不同的签名。

您可能还想阅读covariance and contravariance

答案 2 :(得分:0)

由于您目前正在编写代码,因此您无法满足通过ITestClass界面强加的要求,即ICollection<ITestProp>属性。

解决此问题的一种方法是实际使ITestClass成为通用的,但提供ITestClassProp的通用约束

public interface ITestClassProp
{
    int Value { get; set; }
}

public class TestClassProp : ITestClassProp
{
    public int Value { get; set; }
}


public interface ITestClass<T> where T : ITestClassProp
{
    ICollection<T> TestProp { get; set; }
}

public class TestClass : ITestClass<TestClassProp>
{
    public ICollection<TestClassProp> TestProp { get; set; }
}

这允许您向ITestProp提供实现ICollection的任何具体类型。