【问题标题】:Simple inheritance does not work between projects简单继承在项目之间不起作用
【发布时间】:2018-07-19 15:18:21
【问题描述】:

我只知道我是个白痴,所以请有人告诉我怎么做。

设置很简单:

  1. 使用三个名为 InherTestInherTest.BaseInherTest.Base.Inherited 的项目(.Net 框架、类库)创建解决方案

  2. InherTest.Base中,添加如下类:

    命名空间 InherTest.Base { 公共抽象类 BaseClass { 内部抽象字符串 MEMBER_1 { get; } } }

  3. 将完全相同的代码复制到InherTest,包括命名空间。

  4. InherTest.Base.Inherited中,添加如下类:

    命名空间 InherTest.Base.Inherited { 公共类继承:BaseClass { 内部覆盖字符串 MEMBER_1 { get; } } }

  5. InherTest.Base.Inherited 中的项目引用添加到InherTest.Base。注意错误(“抽象成员未实现”和“找不到合适的成员来覆盖”)。

  6. 删除该引用并将其替换为 InherTest。观察继承也失败了

为什么它们都不起作用?

编辑:最初我说一个测试会失败,另一个会成功;但是,在上述情况下,两种继承尝试都失败了。

【问题讨论】:

  • MEMBER_1 应声明为public
  • Why don't they both work? is 不同,特别是 MEMBER_1 可能在 InherTest 项目中声明为 public。或者,您在项目InherTest中有一个程序集级属性[assembly:InternalsVisibleTo("InherTest.Base.Inherited")]
  • @Igor 是对的。我根据您的指示创建了一个解决方案,但由于 Rahul 和 Dale 给出的原因,它们都失败了。
  • @Igor 你是对的,我已经纠正了这个问题。谢谢。

标签: c# inheritance


【解决方案1】:

这是因为字符串是internal 所以仅限于它自己的项目

【讨论】:

  • 谢谢@Dale。我看到了这个问题,但这仍然给我留下了一个问题。由于基类在另一个程序集中,我不得不将成员更改为Public(我不想要),以便它可以被继承。我能找到的最佳解决方案是使用基类创建一个共享项目,以便将其包含在任何引用它的程序集中。
  • 你可以使用protected internal,如果只有派生类需要访问它,你可以使用protected
【解决方案2】:

为什么它们都不工作?

如果它们包含与您声明的代码相同的代码,它们应该都会失败。如果不是这种情况,那么两个项目之间的代码 不同的,特别是 MEMBER_1 可能在 InherTest 项目中声明为 public

InherTest 的引用与您发布的相同代码一起工作的唯一方法是,如果您在项目InherTest 中有此程序集级属性InternalsVisibleToAttribute

[assembly:InternalsVisibleTo("InherTest.Base.Inherited")]

【讨论】:

    【解决方案3】:

    继承的命名空间位于不同的项目中。 (名称空间似乎在一起,但它们不在同一个程序集中)。你可以阅读那篇文章。

    https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/internal

    【讨论】:

    • internal 指的是程序集,而不是命名空间。顺便说一句,不是我的反对
    • “创建一个包含三个项目的解决方案”对不起,我的意思是因为这三个不同的项目(它们看起来像同一个命名空间,但它们不在同一个程序集中)
    猜你喜欢
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 2013-06-16
    • 2013-09-18
    • 2023-03-29
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    相关资源
    最近更新 更多