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

重写具有不同兼容类型的属性共享

时间:2023-04-10 15:43:27 C#

重写具有不同兼容类型的属性我需要一个具有属性的基类,我可以在具有相同属性但不同(兼容)类型的派生类中使用这些属性。基类可以是抽象的。}}publicclassStrBase:Base{publicoverridestringprop{get;放;}//编译器错误}publicclassUseIt{publicvoiduse(){Listl=newList();//...}}我尝试使用泛型,但这在使用该类时给我带来了问题,因为我想在列表中存储不同类型的基类。公共类BaseG{公共T道具{得到;放;}}publicclassUseIt{publicvoiduse(){Listl=newList();//需要类型参数//...}}这是建议的解决方案另一种方法:publicabstractclassBase{publicabstractvoidUse();公共抽象对象GetProp();}publicabstractclassGenericBase:Base{publicTProp{get;放;}publicoverrideobjectGetProp(){returnProp;}}publicclassStrBase:GenericBase{publicoverridevoidUse(){Console.WriteLine("Usingstring:{0}",Prop);}}publicclassIntBase:GenericBase{publicoverridevoidUse(){Console.WriteLine("Usingint:{0}",Prop);基本上我在中间添加了一个泛型类来存储正确类型的属性。假设您永远不需要从遍历List成员的代码访问Prop,这将起作用。(如果需要,您始终可以向Base添加一个名为GetProp的抽象方法,以将泛型转换为对象。)示例用法:classProgram{staticvoidMain(string[]args){Listl=newList();l.Add(newStrBase{Prop="foo"});l.Add(newIntBase{Prop=42});Console.WriteLine("使用每一项");foreach(varoinl){o.Use();}Console.WriteLine("完成");控制台.ReadKey();编辑:添加GetProp()方法来说明如何直接从基类访问属性。您不能覆盖属性的类型。看看下面的代码:StrBases=newStrBase();基数b=s;这是完全有效的代码。但是当你尝试这样做时会发生什么?b.prop=5;整数可以转换为对象,因为一切都是从对象派生的。但由于b实际上是一个StrBase实例,它必须以某种方式将整数转换为字符串,但它不能。这就是为什么不允许覆盖类型的原因。同样的原则也适用于泛型:List>l=newList>();BaseGs=newBaseG();//编译器不允许这样做。l.添加(s);//同样的问题,整数转字符串?BaseGo=l[0];o.prop=5;这是因为C#2.0中的泛型类型是不可变的。C#4.0确实允许这种类型的转换,称为协变和逆变。解决方案一种选择是在需要时将对象转换为字符串。您可以在子类中添加类型验证:publicclassStrBase:Base{privatestringpropValue;publicoverrideobjectprop{get{returnthis.propValue;}set{if(valueisstring){this.propValue=(string)value;也可以在子类中暴露类型安全的属性:以上是C#学习教程:使用不同的兼容类型,涵盖了属性共享的所有内容,如果对大家有用还需要深入了解C#学习教程,希望大家多多关注—publicclassStrBase:Base{publicstringstrProp{get{return(string)this.prop;}设置{this.prop=value;}}}本文收集自网络,不代表立场。侵权请点击右侧联系管理员删除。如需转载请注明出处: