当前位置: 首页 > 编程语言 > C#

接口实现的抽象基类分享

时间:2023-04-10 23:33:10 C#

接口实现的抽象基类假设我有一个简单的抽象基类abstractclassItem:IDisplayable{publicintId{get;放;}公共字符串名称{得到;放;}公共抽象无效打印();我有一个继承自Chair类的类:}}接口IDisplayable{voidPrint();}子类没有明确表示它也实现了接口,但它会通过简单的继承来实现。如果我们明确地将接口添加到子类,程序的行为是相同的(至少就我在简单示例中所知道的而言)。显式实现接口是好主意还是坏主意,或者它只是一个偏好问题?如果我们明确地将接口添加到子类,程序的行为是相同的(至少就我在简单示例中所知道的而言)。该程序不一定会运行;您的示例不足以说明差异。显式实现接口是好主意还是坏主意,或者它只是一个偏好问题?这是一个坏主意,除非您打算确保接口重新实现语义。让我简单解释一下。这个程序是做什么的?使用系统;接口IFoo{voidBar();无效巴兹();}类Alpha:IFoo{voidIFoo。酒吧(){控制台。WriteLine("Alpha.Bar");无效的IFoo。Baz(){控制台。WriteLine("Alpha.Baz");}}classBravo:Alpha{publicvoidBaz(){Console.WriteLine("Bravo.Baz");}}classCharlieOne:Bravo{publicvoidBar(){Console.WriteLine("CharlieOne.Bar");}}classCharlieTwo:Bravo,IFoo{publicvoidBar(){Console.WriteLine("CharlieTwo.Bar");}}classProgram{staticvoidMain(){IFoofoo=newAlpha();foo.Bar();foo.Baz();foo=newBravo();foo.Bar();foo.Baz();foo=newCharlieOne();foo.Bar();foo.Baz();foo=newCharlieTwo();foo.Bar();foo.Baz();在你继续阅读之前,严肃地说:试着预测这个程序的输出。现在实际运行它。你得到预期的输出了吗?你的直觉哪里错了?你现在看到CharlieOne和CharlieTwo之间的区别了吗?在CharlieTwo中重新实现IFoo可能会导致接口绑定选择Bravo.Baz,即使Bravo没有重新实现IFoo!另一方面:如果你想将Bravo.Baz分配给接口插槽只是因为它存在,那么你可以看到未能重新实现接口会如何导致不正确的代码。Bravo.Baz要替换Alpha.IFoo.Baz,Bravo必须重新实现IFoo。要点如下:当您重新实现接口时,所有接口绑定都会从头开始重新计算。这可能会导致您的程序发生语义变化,因此只有在您打算这样做时才重新实现接口。这也说明了另一种形式的脆弱基类故障。假设当您编写Charlie时,Bravo没有方法Baz。如果您编写Charlie来重新实现IFoo,那么在Bravo的作者之后添加Baz-也许Bravo的作者在您公司的另一个团队中-会更改Charlie的接口绑定,即使这不是Bravo的作者的意图。有关详细信息,请参阅我关于此主题的文章:http://blogs.msdn.com/b/ericlippert/archive/2011/12/08/so-many-interfaces-part-two.aspx由于IteminheritanceIDisplayable,所以任何东西从Item派生的也必须实现IDisplayable。因此,向这些类显式添加IDisplayable是多余的。编辑:@EricLippert强调了重新实现下面接口的效果。我将保留此答案以保留评论中的讨论。当您说“显式实现接口”时,我认为您的意思是在类声明中包含接口。显式实现接口具有不同的具体含义。话虽如此,声明派生类实现由基类实现的接口是不正确的,尽管编译器允许这样做,因为派生类不包含该接口的实现。考虑一下如果基类显式实现接口会发生什么-abstractclassItem:IDisplayable{voidIDisplayable.Print(){...}}现在派生类对基类方法不可见,也没有派生类的消费者。当然,消费者应该使用接口而不是具体的派生类,然后才能访问显式接口方法。但是在派生类本身的范围内,它并不知道基类实现的接口。只有一些成员是抽象的、受保护的或虚拟的。以上就是C#学习教程的全部内容:实现接口的抽象基类。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处: