C#学习教程:将集合访问器添加到派生自仅具有获取访问权限的抽象类的类中的属性我有一个抽象类AbsClass,它实现了一个接口IClass。IClass有几个属性,只有Get访问器。AbsClass将IClass的属性实现为要在从AbsClass派生的类中定义的抽象属性。因此,从AbsClass派生的所有类也需要通过具有与Get访问器相同的属性来满足IClass。但是,在某些情况下,我希望能够将设置访问器添加到IClass的属性。但是,如果我尝试使用集合访问器覆盖AbsClass中的抽象属性,则会收到此错误ConcClassA.Bottom.SetcannotbeoverriddenbecauseAbsClass.Bottomhasnooverridablesetaccessor请参阅下面的ConcClassA。如果我有一个只实现IClass接口但不从AbsClass继承的类,那么我可以毫无问题地添加一个set访问器。请参阅下面的ConcClassB。我可以在AbsClass的每个派生中实现IClass,而不是直接为AbsClass实现IClass。但是我从我的设计中知道每个AbsClass还需要一个IClass,所以我宁愿在层次结构中指定一个更高的值。}双底{得到;}}抽象类AbsClass:IClass{publicabstractdoubleTop{get;}publicabstractdoubleBottom{get;}}classConcClassA:AbsClass{publicoverridedoubleTop{get{return1;}}publicoverridedoubleBottom{get{return1;}//添加Set访问器会导致错误://ConcClassA.Bottom.Set无法覆盖,因为AbsClass.Bottom没有可覆盖的set访问器//set{}}}classConcClassB:IClass{publicdoubleTop{get{return1;}//向接口添加一个集合访问器不会导致问题set{}}publicdoubleBottom{get{return1;}}}如此更新,我认为如果我准确解释我正在尝试做什么而不是使用抽象示例会更有意义。我在一家建筑公司工作,这些是与建筑设计项目相关的业务对象。我有一个抽象类RhNodeBuilding,它表示项目中的一种构建类型。有一些通用函数,例如在RhNodeBuilding中定义的带有楼层的函数。RhNodeBuilding还继承自另一个抽象类,使其成为更大的项目树结构的一部分。RhNodeBuilding是从IBuilding接口实现的,它定义了一些所有建筑物都应该能够提供的只读属性,例如TopElevation、BottomElevation、Height、NumberOfFloors等。请记住,还有其他建筑物类型无法派生来自RhNodeBuilding,但仍需要实现IBuilding。现在我有两种从RhNodeBuilding派生的类型:MassBuilding和FootPrintBuilding。MassBuilding由用户创建的3D形状定义。该形状具有可通过相应属性访问的TopElevation和BottomElevation,但您无法通过更改属性来编辑3D体积。另一方面,FootPrintBuilding由闭合曲线和拉伸该曲线的高度范围定义。因此,该类不仅应该能够返回当前高度,而且还应该能够更改这些高度以重新定义高度范围。所以总结一下。所有建筑物(IBuildings)都需要能够返回TopElevation和BottomElevation,但并非所有建筑物都应允许直接设置TopElevation或BottomElevation。所有RhNodeBuildings都是IBuildings,从RhNodeBuilding派生的类可能需要也可能不需要直接设置TopElevation和BottomElevation。公共接口IBuilding{双顶{得到;}双底{得到;}}抽象类RhNodeBuilding:IBuilding{publicabstractdoubleTop{get;}publicabstractdoubleBottom{get;}}classMassBuilding:AbsClass{//massbuilding只返回Top和Bottom属性,所以它工作正常publicoverridedoubleBottom{get{return1;}}publicoverridedoubleTop{get{return1;}}}classFootPrintBuilding:AbsClass{//FootPrintBuilding的Top和Bottom都可以检索并设置publicoverridedoubleTop{get{return1;}//添加Set访问器会导致错误://无法覆盖,因为RhNodeBuilding.Top没有可覆盖的set访问器//set{}}publicoverridedoubleBottom{get{return1;}//添加Set访问器导致错误://cannotoverridebecauseRhNodeBuilding.Bottomdoesnothaveoverridablesetaccessor//set{}}}现在似乎最好的选择是不让RhNodeBuilding实现IBuilding,而是让每个派生自RhNodeBuilding的类现实IBuilding。这样我就可以直接从IBuilding定义属性而不是覆盖。抽象类AltRhNodeBuilding{publicabstractdoubleTop{get;}}classAltFootPrintBuilding:IClass{publicoverridedoubleTop{get{return1;}//不能添加对重写的抽象属性的集合访问set{}}//将集合访问器添加到接口属性没有问题publicdoubleBottom{get{return1;}set{}}}其工作方式是因为属性并不是真正的虚拟——它们的访问器方法是。因此,如果基类中没有,则不能覆盖set。您可以做的是覆盖和隐藏基类实现并提供您自己的新读/写属性。如果不在层次结构中引入额外的类,我不知道有什么方法可以做到这一点:return((ConcClassB)this).Bottom}}}classConcClassB:AbsClassB{newpublicdoubleTop{get{...}set{...}}newpublicdoubleBottom{get{...}set{...}}}一个更好的想法是在AbsClass中定义一个受保护的虚方法,并基于该方法实现Top.get和Bottom.get。然后,您可以直接在ConcClassB中覆盖此方法,并在没有额外类的情况下为ConcClassB赋予属性:abstractclassAbsClass:IClass{publicdoubleTop{get{returnGetTop();}}publicdoubleBottom{get{returnGetBottom();}}受保护的抽象双GetTop();受保护的抽象双GetBottom();}classConcClassB:AbsClass{newpublicdoubleTop{get{...}set{...}}newpublicdoubleBottom{get{...}set{...}}protectedoverridedoubleGetTop(){returnTop;}protectedoverridedoubleGetBottom(){returnBottom;.听起来你可能真的希望这些比公开更受限制?除此之外,我很难想到这种方法有什么问题。他们会“隐藏”超类中的任何属性,但无论如何超类中都没有属性设置器,所以这似乎没问题。看起来这可能是最简单的修复方法。使用全局变量。以上就是C#学习教程:给类中的属性添加set访问器,派生出只有get访问器的抽象类共享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
