C# 为什么公共类不能从不太可见的类继承?

C# 为什么公共类不能从不太可见的类继承?,c#,.net,inheritance,access-modifiers,C#,.net,Inheritance,Access Modifiers,可能重复: 如果以前有人问过这个问题,我很抱歉。我找了好几遍都没找到 我只是好奇这个设计背后的原理是什么。显然,我知道基类型的私有/内部成员不能也不应该通过派生的公共类型公开。但在我看来,“隐藏的”部分很容易被隐藏,而一些基本功能仍然是共享的,一个新的接口是公开的 我在想一些类似的事情: 组件X 装配Y 当类从基类继承时,基类成员将成为内插类的一部分。为了维护这个概念,基类的可见性范围必须等于或优于固有类。您真正想要的是一种受限形式的非公共继承。在.NET中,基类被视为接口的一部分,而不是实现

可能重复:

如果以前有人问过这个问题,我很抱歉。我找了好几遍都没找到

我只是好奇这个设计背后的原理是什么。显然,我知道基类型的私有/内部成员不能也不应该通过派生的公共类型公开。但在我看来,“隐藏的”部分很容易被隐藏,而一些基本功能仍然是共享的,一个新的接口是公开的

我在想一些类似的事情:

组件X 装配Y
当类从基类继承时,基类成员将成为内插类的一部分。为了维护这个概念,基类的可见性范围必须等于或优于固有类。

您真正想要的是一种受限形式的非公共继承。在.NET中,基类被视为接口的一部分,而不是实现细节。如果要在实现中重用另一个类,当然可以使用组合而不是继承


还请注意,允许实现可见性/可访问性较差的接口。您所询问的限制仅适用于基类。

我理解这样的内部限制

让我创建一个系统。
在这个系统中,你在X学院学习,你有一个我创建的2.0内部考试。
我把那份试卷标为内部试卷

我可以做试卷

  • public
    -在互联网上发布
  • 受保护
    -在教员邮件中发布 团体
  • private
    -将其放置在瑞士保险库中
  • 假设Y学院的两名学生,比如Jon和Eric,拥有5.0的博士学位,也在这个系统中。
    问题纸(对象)与他们无关。
    即使是在互联网(公共)上,他们也不能使用它,因为它对他们毫无用处。
    这就是我最初将其标记为内部的原因


    否则,为什么要有一个名为
    internal
    acceess修饰符呢?

    @dan>问这个伟大的问题不是时候。大多数的C#神都会出现vacation@naveen:哈,那么也许我会在2011年的某个时候给它一次冲击;)@丹,看看这个@安东尼:这的确是同一个问题。你认为我们应该关闭这个吗?我注意到的唯一可能有价值的区别是,我对语言不同时可能出现的其他行为给出了一个适度详细的描述(我尴尬地没有意识到这显然描述了其他一些语言是如何工作的)。@winwaed:这是一个奇怪的问题,但是。。。我原来的措词错了吗?我不反对编辑,只是好奇而已。这个例子与继承有什么关系?声明内部不应该被继承到另一个程序集。是的,我这样做,因为我的误解,像你一样,这是否决某人的一个很好的理由。
    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?
        }
    }
    
    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?
    }