大佬教程收集整理的这篇文章主要介绍了类/接口:A 没有实现具有 IB 类型属性的 IA,尽管实现了 B 实现了 IB,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
有人可以解释为什么这不能编译吗?更具体地说,您收到一个错误,指出类 A 没有实现 IA,即使 B“是”(实现)IB,这应该满足 IA?还是我做错了什么?
(我想保持 A/B 尽可能具体,同时仍然实现 IA/IB 以便将其传递给接受 IA 的方法)
public interface IA {
public String FIEld { get; set; }
public IB B { get; set; }
}
public interface IB {
public String OtherFIEld { get; set; }
}
public class A : IA {
public String FIEld { get; set; }
public B B { get; set; }
}
public class B : IB {
public String OtherFIEld { get; set; }
}
您正在更改接口强制执行的签名。
即使 B
实现了 IB
,可能还有另一个类实现了 IB
,对于 IA
接口,它是一个有效的类型,可以设置为属性 B
.
例如:
public class A1
{
public String Field { get; set; }
public IB B { get; set; }
public A1()
{
B = new B(); // completely valid
B = new Bv2(); // completely valid as well,as Bv2 : IB
}
}
public class A2
{
public String Field { get; set; }
public B B { get; set; }
public A2()
{
B = new B(); // completely valid
B = new Bv2(); // CTE: CAnnot implicitly convert type 'Bv2' to 'B'
}
}
因此,在您的示例中,您只需稍微调整类 A
即可使其正常工作:
public class A : IA
{
public String Field { get; set; }
public IB B { get; set; }
}
或者让 IA 专门接受属性 B
作为类 B
的实例(第一种选择通常更好,允许更灵活的设计):
public interface IA
{
String Field { get; set; }
B B { get; set; }
}
,
正如 pinkfloydx33 在他们的评论中指出的那样,必须严格遵循接口签名,因此 A
必须具有 IB
类型的属性,而不是任何实现 {{ 1}}。另外,最好是 IB
不依赖于 A
的具体实现。因此,您的 IB
类必须(并且应该)如下所示:
A
注意
public class A
{
public String Field {get; set;}
public IB B {get; set;}
}
有效并且您不需要强制转换,因为 var b = new B();
var a = new A();
a.b = b;
被隐式转换为 b
什么应该起作用:
public interface IA<out TIB> where TIB : IB // EDIT: Changed to "out" TIB
{
public String Field { get; set; }
public TIB B { get; } // Edit: removed setter. Not possible with "out" Type
}
public interface IB
{
public String OtherField { get; set; }
}
public class A : IA<B>
{
public String Field { get; set; }
public B B { get; set; }
}
public class B : IB
{
public String OtherField { get; set; }
}
以上是大佬教程为你收集整理的类/接口:A 没有实现具有 IB 类型属性的 IA,尽管实现了 B 实现了 IB全部内容,希望文章能够帮你解决类/接口:A 没有实现具有 IB 类型属性的 IA,尽管实现了 B 实现了 IB所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。