Jor*_*rdy 6 c# inheritance abstract-class
背景:我仍然是C#新手,这是我的第一个继承的大项目.以下故事是我目前情况的简化示例:
假设我有一个叫做的课程LivingOrganism.每个生物都可以使用这个类作为基础并继承所有生物体共有的功能.
当我在其中一些derived课程上工作时,我发现香蕉和人类非常相似.虽然它没有多大意义,它们看起来没什么相似之处,但它们显然具有大多数共同的"功能".
代码重复很糟糕,所以我写了一个新类来降低维护成本.这个类叫做:BananaHuman.我的Human班级和Banana班级继承自BananaHuman.
问题:
我对我的BananaHuman没有任何问题(即我明白它意味着什么以及它存在的原因).但最终,其他人(即使那些没有(完全)理解继承的人)也必须使用我的LivingCreatures.dll.并且他们不明白为什么intellisense会在他们输入'B'时建议BananaHuman.
并考虑以下代码:
//Valid and makes sense.
foreach(LivingOrganism foo in cityOfNeyYork) { /*embedded statement*/ }
Run Code Online (Sandbox Code Playgroud)
但是想象一下,如何怪异/混乱,如果我们代替它看起来Living Organism有BananaHuman.
我无法制作BananaHuman private,protected或者protected internal(在命名空间中定义的元素不能以这种方式显式声明).我也做不到internal,因为Human而且Banana 必须如此public.如果我试试这个,我会收到一条错误消息,说明存在inconsistent accessibility问题.
我觉得我错过了明显的,但我能做什么/应该做什么?我留下了几个选项/问题:
BananaHuman以避免混淆?BananaHuman一些非常长的技术,比如DnaRelatedOrganismsType[X]"X"描述它们的独特关系吗?BananaHuman,让Human和Banana继承LivingOrganism,并做额外的维护有什么需要改变的时候?我四处寻找并且找不到这种情况的"固定模式".我发现这个问题有类似的标题,但我不知道答案是否适用,因为看起来他问的是完全不同的东西.
任何帮助是极大的赞赏!
您可以使用EditorBrowsableAttribute并将其应用于您的班级.如果人们使用你的.dll,这将使你的课程从Intellisense中消失.如果您引用了项目而不是dll,它仍然可见.
使用如下:
[EditorBrowsable(EditorBrowsableState.Never)]
public class BananaHuman
{
//....
}
Run Code Online (Sandbox Code Playgroud)
所以,如果你愿意给我你的.dll,我不会看到BananaHuman在Intellisense中弹出.但是,如果我要检查香蕉或人类,我仍然会看到它继承,BananaHuman因为情况就是如此.该EditorBrowsable属性只是让它从Intellisense中消失,你想要的是什么.