2012-01-05 137 views
1

我不明白展出低于为什么我不能拥有从内部类继承的公共类?

public abstract class Base { } 
internal class Common : Base { } 
public class Instance : Common { } 

这不会编译无障碍限制。

可访问性不一致:基类的通用“比类较少访问的“实例”

我能做到什么,我想与公共抽象类常见的,但为什么我不能简单地不公开姓名在所有?

编辑:我问的是为什么它这样工作!每个人都在回应规则是什么,而不是解释为什么规则是这样的。

+2

你能澄清更多? – 2012-01-05 05:50:50

+0

你为什么要隐藏Common?抽象类不能被实例化。 – alexm 2012-01-05 05:51:49

+1

它不会编译出什么错误? – gideon 2012-01-05 05:54:57

回答

3

类的继承者不能扩大基类的可访问范围。

市民:访问不限 内部:访问限于此程序

一旦局限于程序,的所有传承,internal class必须保持internal或承担更小的可访问性(protected internalprivate)。

C# specification,部分§3.5.4辅助约束

参数类型实例构造的必须至少为 作为实例构造本身可访问的。

在该示例

class A {...} 

public class B: A {...} 

B类别导致编译时错误,因为A是不至少 可访问作为B.

另外:

类类型的直接基类必须至少与类类型本身(§3.5.2)一样可访问 。例如,对于公共类从私有或内部类派生的编译时 错误。

如果你想创建一个Common类功能,你不想做外部代码访问,你应该prefer composition over inheritance。例如:

public abstract class Base 
{ 
... 
} 

internal class Common : Base 
{ 
... 
} 

public class Instance 
{ 
    internal Instance(Common common) 
    { 
     ... 
    } 
... 
} 
+0

请注意,有关实例构造函数和参数类型的位与该问题或代码片段并非特定相关,它只是该特定部分中许多部分的最后一个要点。这里的相关要点实际上是第一个,这与后面在规范中找到的第二个引用部分相匹配。 – 2012-01-05 06:00:56

0

如果Common包含一个属性,可以说Foo

public string Foo { get; set; } 

Instance类将自动公开该属性。你可以认为它是这样的:

public void Test() 
{ 
    Common myInstance = new Instance(); 
    System.Console.WriteLine(myInstance.Foo); 
} 

由于Instance需要公开Common了,在基类中的访问修饰符不能少暴露一切。

但是,您可以创建属性Foo作为内部来完成相同的操作。

2

这是代码对其他程序集的可见程度。通过设置Common内部限制对组件的访问权限,而通过将Instance设置为公共,您可以让实例可以访问任何引用程序集。如果引用程序集无法访问某个类型的基类,它如何访问从该基类继承的任何成员?

相关问题