C# 非一般对冲
假设我有这两个接口C# 非一般对冲,c#,inheritance,interface,covariance,C#,Inheritance,Interface,Covariance,假设我有这两个接口 public interface A { } public interface B { A a {get;} } 这两种具体的类型 public class ConcreteA : A { } public class ConcreteB : B { public ConcreteA a {get;} } 这不会编译,因为接口B需要的是接口A而不是具体的A 目前我正在用接口自动生成代码,我遇到了这个senario。我不想修改我的所有模型来实现和显式的接口
public interface A
{
}
public interface B
{
A a {get;}
}
这两种具体的类型
public class ConcreteA : A
{
}
public class ConcreteB : B
{
public ConcreteA a {get;}
}
这不会编译,因为接口B需要的是接口A而不是具体的A
目前我正在用接口自动生成代码,我遇到了这个senario。我不想修改我的所有模型来实现和显式的接口定义,在这些接口定义中将返回我的具体类的接口版本,我想使用协方差的某个版本来实现这一点,但我不确定是否有办法做到这一点,或者这是否是C#的限制
你必须使它通用,这样才能工作
public interface B<T> where T : A
{
T a {get; set;}
}
public class ConcreteA : A
{
}
public class ConcreteB : B<ConcreateA>
{
public ConcreteA a {get; set;}
}
无法强制您仅将其设置为
ConcreteA
否则。您需要泛型,因为B=new ConcreteB()
将允许您将a
设置为实现a
的任何内容,而不仅仅是ConcreteA
@juharr。谢谢,我看得太多了。假设你只得到了界面,仍然可以做,但这将是一个具体的利基使用你的权利,我会接受这作为一个答案,当时间限制允许我
B b = new ConcreteB();
b.a = AnythingThatImplementsA;