程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了类/接口:A 没有实现具有 IB 类型属性的 IA,尽管实现了 B 实现了 IB大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决类/接口:A 没有实现具有 IB 类型属性的 IA,尽管实现了 B 实现了 IB?

开发过程中遇到类/接口:A 没有实现具有 IB 类型属性的 IA,尽管实现了 B 实现了 IB的问题如何解决?下面主要结合日常开发的经验,给出你关于类/接口:A 没有实现具有 IB 类型属性的 IA,尽管实现了 B 实现了 IB的解决方法建议,希望对你解决类/接口: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,请注明来意。
标签: