C# 为什么公共类不能从不太可见的类继承?
可能重复:C# 为什么公共类不能从不太可见的类继承?,c#,.net,inheritance,access-modifiers,C#,.net,Inheritance,Access Modifiers,可能重复: 如果以前有人问过这个问题,我很抱歉。我找了好几遍都没找到 我只是好奇这个设计背后的原理是什么。显然,我知道基类型的私有/内部成员不能也不应该通过派生的公共类型公开。但在我看来,“隐藏的”部分很容易被隐藏,而一些基本功能仍然是共享的,一个新的接口是公开的 我在想一些类似的事情: 组件X 装配Y 当类从基类继承时,基类成员将成为内插类的一部分。为了维护这个概念,基类的可见性范围必须等于或优于固有类。您真正想要的是一种受限形式的非公共继承。在.NET中,基类被视为接口的一部分,而不是实现
如果以前有人问过这个问题,我很抱歉。我找了好几遍都没找到 我只是好奇这个设计背后的原理是什么。显然,我知道基类型的私有/内部成员不能也不应该通过派生的公共类型公开。但在我看来,“隐藏的”部分很容易被隐藏,而一些基本功能仍然是共享的,一个新的接口是公开的 我在想一些类似的事情: 组件X 装配Y
当类从基类继承时,基类成员将成为内插类的一部分。为了维护这个概念,基类的可见性范围必须等于或优于固有类。您真正想要的是一种受限形式的非公共继承。在.NET中,基类被视为接口的一部分,而不是实现细节。如果要在实现中重用另一个类,当然可以使用组合而不是继承
还请注意,允许实现可见性/可访问性较差的接口。您所询问的限制仅适用于基类。我理解这样的内部限制 让我创建一个系统。
在这个系统中,你在X学院学习,你有一个我创建的2.0内部考试。
我把那份试卷标为内部试卷 我可以做试卷
public
-在互联网上发布受保护
-在教员邮件中发布
团体private
-将其放置在瑞士保险库中问题纸(对象)与他们无关。
即使是在互联网(公共)上,他们也不能使用它,因为它对他们毫无用处。
这就是我最初将其标记为内部的原因
否则,为什么要有一个名为
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?
}