显然,这适用于Java:
class BigClass
{
public SecretClass not_so_secret = new SecretClass();
public class SecretClass
{
// Methods and stuff
}
}
但是C#中没有等效项吗?在哪里可以创建BigClass的实例,但不能创建子类SecretClass
:
class testing_class
{
BigClass BIG_CLASS_SHOULD_BE_ALLOWED = new BigClass();
BigClass.SecretClass SUB_CLASS_SHOULD_NOT = new BigClass.SecretClass();
}
我已经尝试了内部(听起来不错...),私有,受保护的组合-现在基本上只使用了所有这些:D
在C#中,总是有这条单向街道作为访问修饰符是基本的双向原则吗?
通过这种方式,我确实找到了一个关于Kotlin(无论是什么)的答案here,这似乎是一件很严格的事情,对某些人来说毫无意义或出于某种原因是危险的-“内部”创建的私有类的公共实例
是否无法在c#中实现这种访问级别?
答案 0 :(得分:2)
如果要使成员(字段,属性,方法,事件,委托或嵌套类型)公开,则此成员公开的所有类型都必须是公开的。
但是,有一个技巧可以使类仅在BigClass
中可实例化:使类abstract
,并且如果需要编写构造函数,则使它protected
或者,因为C#7.2 private protected
(请参见下文)。然后从中派生出嵌套的private class
。
public class BigClass
{
public SecretClass not_so_secret = new VerySecretClass();
public abstract class SecretClass
{
}
private class VerySecretClass : SecretClass
{
}
}
还将所有您不想公开的东西设为私有或受保护。您甚至可以为设置者提供更多限制性访问修饰符。
public string Text { get; private set; } // or: protected set;
如果您正在编写类库,它也有助于使事情internal
。它使其他装配体看不见东西。
自C#7.2起,可访问性也有了新的提高(来自C# 7 Series, Part 5: Private Protected):
受私有保护
受保护的私有对象:在具有这种可访问性的情况下,声明的成员可以在从此包含类型派生的类型中看到 包含的程序集。对于任何未派生的类型均不可见 从包含类型,或在包含程序集之外。即 该访问仅限于包含程序集内的派生类型。