为什么公有类不能继承不可见的类?

7

可能是重复问题:
C#:为什么我的公共类不能扩展内部类?

如果此问题以前已经被提出,我很抱歉。我在Stack Overflow上搜索过,但没有找到。

我只是好奇这种设计背后的原理是什么。显然,我理解基类型的私有/内部成员不能暴露通过派生公共类型。但是,在我的天真思考中,似乎“隐藏”的部分可以保持隐藏,同时仍共享一些基本功能并公开新接口。

我考虑以下内容:

Assembly X

internal class InternalClass
{
    protected virtual void DoSomethingProtected()
    {
        // Let's say this method provides some useful functionality.
        // Its visibility is quite limited (only to derived types in
        // the same assembly), but at least it's there.
    }
}

public class PublicClass : InternalClass
{
    public void DoSomethingPublic()
    {
        // Now let's say this method is useful enough that this type
        // should be public. What's keeping us from leveraging the
        // base functionality laid out in InternalClass's implementation,
        // without exposing anything that shouldn't be exposed?
    }
}

装配 Y

public class OtherPublicClass : PublicClass
{
    // It seems (again, to my naive mind) that this could work. This class
    // simply wouldn't be able to "see" any of the methods of InternalClass
    // from AssemblyX directly. But it could still access the public and
    // protected members of PublicClass that weren't inherited from
    // InternalClass. Does this make sense? What am I missing?
}

@dan > 现在问这个好问题的时机不太好。大部分C#大神都在度假。 - naveen
@naveen:哈,那也许我会在2011年的某个时候给它一个推动。 - Dan Tao
1
@Dan,请看一下这个链接。https://dev59.com/Z3A65IYBdhLWcg3wyh97 - Anthony Pegram
@winwaed:这是一个奇怪的问题,但是……我的原始措辞有问题吗?我并不是在质疑编辑,只是好奇。 - Dan Tao
@Dan,问题是相同的,因此将其关闭为重复项似乎是一个合理的选择。有能力找到决定不使用C# /.NET的“原因”的人已经回答了另一个问题,如果需要/值得进一步讨论,他可能会在博客中写到它。 - Anthony Pegram
显示剩余4条评论
3个回答

4
您实际上要求的是一种受限制的非公共继承形式。在.NET中,基类被视为接口的一部分,而不是实现细节。如果您想在实现中重用另一个类,则当然可以使用组合而不是继承。
此外,请注意,实现具有较低可见性/可访问性的接口是允许的。您所问的限制仅适用于基类。

是的,我也因为误解而这样做,这是一个下投票的好理由。 - Saeed Amiri

2

当一个类从一个基类继承时,基类成员将成为继承类的一部分。为了保持这个概念,基类的可见性范围必须等于或优于继承类。


1

我对internal的理解如下。

让我创建一个系统。
在这个系统中,你正在学习College-X,并且我为你们制定了一个2.0的内部考试。
我将那份试卷标记为内部考试。

我可以制作题目

  1. public - 在互联网上发布
  2. protected - 在教师邮件组中发布
  3. private - 放置在瑞士的金库里

假设College-Y有两名学生(Jon和Eric),他们拥有5.0的博士学位,并且也在此系统中。
但是,这份试卷(对象)与他们无关。
即使它放在互联网上(公共的),他们也不应该使用它,因为它对他们没有用。
这就是为什么我最初将其标记为内部的原因。

否则,为什么会有一个叫做internal访问修饰符呢?


3
这个例子与继承有什么关系? - Ben Voigt
声明内部成员不应该被继承到另一个程序集中。 - naveen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接