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

C#——使用扩展方法提供默认接口实现分享

时间:2023-04-10 20:15:42 C#

完成。说:publicinterfaceAnimal{stringMakeSound();}publicstaticstringMakeSound(thisAnimal){return"";}然后publicclassDog:Animal{stringMakeSound(){return"Bark";}}publicclassPorcupine:Animal{}最后:Animaldog=newDog();动物豪猪=newPorcupine();打印(狗。MakeSound());打印(豪猪。MakeSound());我希望豪猪和其他没有显式实现MakeSound的动物使用return空字符串的默认扩展方法,但是狗和任何具有显式实现的动物都会返回它们自己的实现,例如“Bark”。所以我的问题:1.这可能吗?2.如果不行,有没有其他方法可以实现接口的默认行为?抽象类而不是接口不是一种选择,因为C#不支持多重继承,而我的类继承了另一个类的行为。我通常推荐一个基类,但如果没有,你可以这样做:publicinterfaceIAnimal{}publicinterfaceINoisyAnimal:IAnimal{stringMakeSound();}publicstaticclassAnimalExtensions{publicstaticstringMakeSound(thisIAnimalsomeAnimal){if(someAnimalisINoisyAnimal){return(someAnimalasINoisyAnimal).MakeSound();}else{返回“未知噪音”;}}}publicclassDog:INoisyAnimal{publicstringMakeSound(){return"Bark";Porcupine:IAnimal{}这使得每个IAnimal看起来都像INoisyAnimal,即使它不是真的。例如:IAnimaldog=newDog();IAnimalporcupine=newPorcupine();Console.WriteLine(dog.MakeSound());//树皮Console.WriteLine(porcupine.MakeSound());//UnknownNoise但是,这仍然不是接口的实际实现。请注意,尽管Console.WriteLine(豪猪是INoisyAnimal);//false另一种选择可能是在需要新功能时创建一个扩展基类的包装器:publicclassNoisyAnimalWrapper:INoisyAnimal{privatereadonlyIAnimalanimal;publicNoisyAnimalWrapper(IAnimalanimal){this.animal=animal;}publicstringMakeSound(){返回“未知噪音”;}}publicstaticclassAnimalExtensions{publicstaticINoisyAnimalNoisy(thisIAnimalsomeAnimal){返回someAnimal作为INoisyAnimal??新的嘈杂动物(一些动物);然后,您可以在需要时从任何IAnimal创建INoisyAnimal:INoisyAnimaldog=newDog();INoisyAnimalporcupine=newPorcupine().Noisy();Console.WriteLine(dog.MakeSound());//树皮Console.WriteLine(porcupine.MakeSound());//UnknownNoise您还可以使包装器通用(例如NoisyAnimalwhereT:IAnimal,new)并完全摆脱扩展方法。根据您的实际用例,这可能比以前的选项更可取。我不知道你的实际情况是什么,或者你只是在试验,但是,如果只是一些动物发出噪音,那么它可能是接口隔离的一个很好的例子。例如:publicclassDog:IAnimal,INoisy{publicstringMakeSound(){return"Bark";}}publicclassPorcupine:IAnimal{}然后你只会调用MakeSound或实际上有噪音的对象。这样的事情怎么样?它可以让你避免使用基类,你可以做你想做的,对吧?以上就是C#学习教程:C#-使用扩展方法提供默认接口实现分享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——publicinterfaceAnimal{//Fieldsstringvoice{get;}}publicstaticclassAnimalHelper{//为任何Animal调用publicstaticstringMakeSound(thisAnimalanimal){//所有动物的通用代码,基于它们声音的值returnanimal.voice;}}publicclassDog:Animal{publicstringvoice{get{return"Woof!";}}}publicclassPurcupine:Animal{publicstringvoice{get{return"";}}}本文收集自网络,不代表立场,如有侵权请点右联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢