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

在实现具有对象类型属性的接口的类中更改属性类型分享

时间:2023-04-10 21:09:57 C#

C#学习教程:在使用对象类型属性实现接口的类中更改属性类型随着应用程序的成熟,我想添加控件作为插件。目前我有这样的结构:interfaceIControlstringIdobjectValueclassLabel:IControlstringIdstringValueclassRepeater:IControlstringIdListValue现在,您将立即在Repeater类中使用Value属性看到奇怪的部分。我希望使用Value类型作为接口中的对象将使我能够在继续进行时灵活地扩展控件。编译器不喜欢这样,我想这是有充分理由的。结论:我试图让所有控件类实现相同的接口,但Value属性具有不同的类型。有没有人对如何实现这一目标有任何建议?注意:请不要建议使用SparkViewEngine进行模板化。我有理由为自己创造额外的工作。通常,Repeater会实现一些不同的东西,例如IItemsControl。编辑1(为简洁起见删除)编辑2那么,您当然可以使用显式接口实现:interfaceIControl{stringId{get;放;}对象值{得到;放;}}classLabel:IControl{publicstring}publicstringValue{get;放;}objectIControl.Value{get{returnthis.Value;}set{this.Value=(string)value;}}}classRepeater:IControl{publicstringId{get;放;}公共IList值{得到;放;}objectIControl.Value{get{returnthis.Value;}set{this.Value=(IList)value;}}}你也可以使用泛型:}}classSomeOtherControl:IControl{publicstringID{get;set}publicintValue{get;set;}}如果它只是一个需要更改的返回值,我更喜欢它而不是显式接口的想法。但是,我认为如果您有多个属性,每个属性都会返回不同的类型,那么您不希望有一个IControl。至少,我不会。在这种情况下,我建议使用显式接口。当然,如果您无权访问IControl的源代码,这将不起作用。编辑:有一个错字。Fixed否,编译器不允许具有相同名称的字段具有与派生类中接口中定义的数据类型不同的数据类型。属性(因为接口中不允许有任何字段)应该在派生类中实现,并且它们需要具有相同的数据类型。因此,您不能在没有显式声明的情况下使用属性。但是如果你让一个函数返回值然后它工作但是你需要检查返回类型因为返回类型应该与函数匹配否则你会得到接口函数没有实现的错误。接口IControl{对象值();}A类:IControl{stringm_value=string.Empty;publicobjectValue(){返回m_value;}};B类:IControl{Listm_value=newList();公共对象值(){返回m_value;}};....objecto=newB().Value();if(oisList)MessageBox.Show("列表");[更新]如果属性的主体被显式定义,那么要小心。如果不小心,为两个属性设置名称是危险的。这两个属性,如果包含不同的定义,对于接口和类的最终使用是莫名其妙的。publicIListValueobjectIControl.Value看这个例子:...classRepeater:IControl{Listm_Value=newList();publicIListValue{get{returnthis.m_Value;}set{this.m_Value=(IList)value;}}objectIControl.Value{get{returnthis.m_Value;}set{this.m_Value=newList();this.m_Value.Add(新标签());this.m_Value.AddRange((List)value);}}}...Repeaterb=newRepeater();我控制i=b;列表列表=新列表();list.Add(newRepeater());i.Value=列表;您可以观察到,当通过IControl添加数据时,Repeater中的列表容器将具有不同的值(因为显式定义了IContainer.Value)。以上是C#学习教程:在实现接口的类中更改属性类型为对象类型属性。所有内容分享,如果对大家有用,需要了解更多C#学习教程,希望大家多多关注—本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: