我首先使用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?
由于
答案 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
的任何具体类型。