gpt4 book ai didi

c# - 使抽象类不可见;或 : hiding my BananaHuman

转载 作者:太空狗 更新时间:2023-10-29 21:39:51 25 4
gpt4 key购买 nike

背景:我还是一个C#新手,这是我第一个继承的大项目。以下故事是我当前情况的一个简化示例:

假设我有一个名为 LivingOrganism 的类.每个生物都可以以这个类为基础,继承所有生物共有的功能。

当我在处理其中一些时 derived类,我发现香蕉和人类 are very similar 。尽管这没有多大意义,而且它们看起来一点也不像,但它们显然具有大部分“功能”的共同点。

代码重复是不好的,所以我写了一个新类来减少维护成本。此类称为:BananaHuman .我的Human类和 Banana类继承自 BananaHuman .


问题:

我对我的 BananaHuman 没有任何问题(即我理解它的含义以及它存在的原因)。但最终,其他人(甚至那些不(完全)理解继承的人)将不得不使用我的 LivingCreatures.dll。而且他们不明白为什么 intellisense 在他们键入“B”时建议使用 BananaHuman。

并考虑以下代码:

//Valid and makes sense.
foreach(LivingOrganism foo in cityOfNeyYork) { /*embedded statement*/ }

但是想象一下,如果我们用 Living Organism 代替它会看起来多么奇怪/令人困惑与 BananaHuman .

我做不到BananaHuman private , protectedprotected internal (命名空间中定义的元素不能以这种方式显式声明)。我也做不到internal ,因为 HumanBanana 必须public .如果我尝试这样做,我会收到一条错误消息,指出有一个 inconsistent accessibility问题。

我觉得我错过了显而易见的事情,但我能/应该做什么?我剩下几个选项/问题:

  1. 是否可以“隐藏”BananaHuman以避免混淆?
  2. 我应该重写 BananaHuman 吗?一些很长的技术性的东西,比如DnaRelatedOrganismsType[X] ,其中“X”描述了它们的独特关系?
  3. 我应该删除 BananaHuman 吗? , 让HumanBanana继承自 LivingOrganism并在需要更改时进行额外维护?
  4. 还有其他我完全想念的解决方案吗?

我四处搜索,找不到适合这种情况的“固定模式”。我找到了 this标题相似的问题,但我不知道答案是否适用,因为他似乎在问完全不同的问题。

非常感谢任何帮助!

最佳答案

您可以使用 EditorBrowsableAttribute 并将其应用于您的类。如果人们正在使用您的 .dll,这将使您的类从 Intellisense 中消失。如果您引用的是您的项目而不是 dll,它仍然可见。

像这样使用:

[EditorBrowsable(EditorBrowsableState.Never)]
public class BananaHuman
{
//....
}

因此,如果您愿意给我您的 .dll,我将不会在 Intellisense 中看到 BananaHuman 弹出。但是如果我检查 Banana 或 Human 类,我仍然会看到它是从 BananaHuman 继承的,因为情况就是这样。 EditorBrowsable 属性只是让它从 Intellisense 中消失,你想要什么就是什么。

关于c# - 使抽象类不可见;或 : hiding my BananaHuman,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18352509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com