使抽象类不可见; 或者:隐藏我的BananaHuman

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 OrganismBananaHuman.

我无法制作BananaHuman private,protected或者protected internal(在命名空间中定义的元素不能以这种方式显式声明).我也做不到internal,因为Human而且Banana 必须如此public.如果我试试这个,我会收到一条错误消息,说明存在inconsistent accessibility问题.

我觉得我错过了明显的,但我能做什么/应该做什么?我留下了几个选项/问题:

  1. 是否有可能"隐藏" BananaHuman以避免混淆?
  2. 我应该重写BananaHuman一些非常长的技术,比如DnaRelatedOrganismsType[X]"X"描述它们的独特关系吗?
  3. 如果我只是删除BananaHuman,让HumanBanana继承LivingOrganism,并做额外的维护有什么需要改变的时候?
  4. 还有另一种我完全失踪的解决方案吗?

我四处寻找并且找不到这种情况的"固定模式".我发现这个问题有类似的标题,但我不知道答案是否适用,因为看起来他问的是完全不同的东西.

任何帮助是极大的赞赏!

Syn*_*der 5

您可以使用EditorBrowsableAttribute并将其应用于您的班级.如果人们使用你的.dll,这将使你的课程从Intellisense中消失.如果您引用了项目而不是dll,它仍然可见.

使用如下:

[EditorBrowsable(EditorBrowsableState.Never)]
public class BananaHuman
{
    //....
}
Run Code Online (Sandbox Code Playgroud)

所以,如果你愿意给我你的.dll,我不会看到BananaHuman在Intellisense中弹出.但是,如果我要检查香蕉或人类,我仍然会看到它继承,BananaHuman因为情况就是如此.该EditorBrowsable属性只是让它从Intellisense中消失,你想要的是什么.