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

VB.NET和C#属性之间的多级继承共享

时间:2023-04-10 11:17:21 C#

VB.NET和C#属性之间的多级继承假设我有2个接口定义如下:publicinterfaceISkuItem{publicstringSKU{get;放;}}publicinterfaceICartItem:ISkuItem{publicintQuantity{get;放;}publicboolIsDiscountable{get;放;当我在C#中实现接口时,VS生成以下模板代码:...}set{...}}#endregion#regionISkuItemMemberspublicstringSKU{get{...}set{...}}#endregion}在VB.NET中,同一个类是这样构建的:公共类CartItem实现ICartItem公共属性IsDiscountable作为布尔值实现ICartItem.IsDiscountable“GETSET”结束属性EndClassVB.NET明确要求您在每个Implements中都有一个IInterfaceName。在PropertyName之后添加ImplementsIInterfaceName.PropertyName,而C#仅使用region来指示哪些属性和方法属于该接口有趣的是,在VB.NET中,在SKU属性上,我可以指定ImplementsISkuItem.SKU或ImplementsICartItem.SKU。虽然VS构建的模板默认为ISkuItem,但如果需要,我也可以指定ICartItem。奇怪的是,由于C#仅使用区域属性来防止继承,我似乎无法像在VB.NET中那样在C#中显式指定SKU的实现接口。我的问题是:能够在VB.NET中指定一个或另一个接口来实现该属性是否重要,如果是这样,是否有一种方法可以在C#中模仿此功能?另外,在实现属性时将一个接口分配给另一个接口有什么影响?我认为其他答案实际上有点不合适。在您发布的示例中,一个接口继承自另一个接口。它只是意味着它提供与其基础相同的成员,以及一些其他成员。这些不是恰好公开具有相同名称的成员的两个独立接口。ICartItem.SKU与ISkuItem.SKU相同。ICartItem继承自ISkuItem仅意味着作为接口的ISkuItem表示ICartItem提供的功能的子集。考虑以下代码:classCartItem:ICartItem{publicintQuantity{get;放;}publicboolIsDiscountable{get;放;}stringISkuItem.SKU{get{返回“ISkuItem”;}设置{抛出新的NotSupportedException();}}stringICartItem.SKU{get{返回“ICartItem”;}设置{抛出新的NotSupportedException();}}}这个类不会编译。在这种情况下,您不能显式定义ICartItem.SKU,因为ICartItem.SKU就是ISkuItem.SKU。没有要定义的“其他”SKU属性。因此,直接回答您的问题:在VB.NET中能够指定一个或另一个接口来实现适当的特征是否重要?当它们是独立的、不相关的接口时:是的。正如其他人所指出的,您可以为共享通用名称的不同接口成员提供不同的实现。但是当一个接口继承另一个接口时:不。没关系,因为它们是同一回事。当实施适当时,指定一个接口优于另一个接口有什么影响?此外,如果它们是不相关的接口,则会产生其他人已经讨论过的效果:为两个接口提供不同的实现。但是,如果一个来自另一个,则没有影响。是的,这很重要,这叫做Explicit和Implicit接口实现。在C#中,您可以通过在方法名称前添加接口名称来实现此目的,如下所示:IsDiscountable{get{...}set{...}}#endregion#regionISkuItemMemberspublicstringISkuItem.SKU{get{...}set{...}}//喜欢这个publicstringICartItem.SKU{get{...}set{...}}//likethis#endregion}是的,你可以在每个接口后面实现不同的功能。假设两个接口具有相同的签名。根据您实现的实现接口,将控制执行哪个接口。...C#显式接口示例...publicinterfaceITest1{stringGet();}publicinterfaceITest2{stringGet();}//new只是为了去掉一个编译器警告publicinterfaceITest3:ITest1,ITest2{newstringGet();}publicclassMyTest:ITest1,ITest2{publicstringGet(){return"local";}字符串ITest1。Get(){返回“你好”;}字符串ITest2。Get(){返回“世界”;字符串ITest3.Get(){返回“嗨”;}}classProgram{staticvoidMain(string[]args){varmytest=newMyTest();//请注意,如果所有接口都是显式的,则mytest.Get()不存在//varv0=mytest.Get();//localvarv1=((ITest1)mytest).Get();//你好varv2=((ITest2)mytest).Get();//worldvarv3=((ITest3)mytest).Get();//hi}}...VB.Net中的类似代码...以上是C#学习教程:VB.NET和C#中属性的多级实现如果所有继承共享的内容对你和你都有用需要了解更多C#学习教程,希望大家多多关注—ModuleModule1SubMain()Dimmyinstance=NewMyTest()Dimv0=myinstance.DoWork()'local'Byt他的方式...请注意,以下方法在类Dimv1=DirectCast(myinstance,ITest1).DoWork()'helloDimv2=DirectCast(myinstance,ITest2)中由接口签名而不是定义方法名称调用).DoWork()'worldDimv3=DirectCast(myinstance,ITest3).DoWork()'hiEndSubEndModulePublicInterfaceITest1FunctionDoWork()AsStringEndInterfacePublicInterfaceITest2FunctionDoWork()AsStringEndInterface公共接口ITest3继承ITest1继承ITest2ShadowsFunctionDoWork()AsStringEndInterfacePublicClassMyTestImplementsITest3'ImplementsITest1'ImplementsITest2PublicFunctionDoWork()AsStringReturn"local"EndFunctionPrivateFunctionDoWork1()AsStringImplementsITest1.DoWorkReturn“hello”结束函数私有函数DoWork2()作为字符串实现ITest2.DoWork返回“世界”结束函数私有函数DoWork3()作为字符串实现ITest3.DoWork返回“hi”结束函数结束Class本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: