D - 构造函数上的访问修饰符实际上做了什么?
D - What does an access modifier on a constructor actually do?
假设我有以下代码:
class Foo
{
private this(int x){ }
}
void
main()
{
auto f = new Foo(4);
}
令我惊讶的是,这实际上可以编译。我希望私有构造函数在其定义的 class 之外无法使用,就像方法一样,但事实显然并非如此。语言参考甚至没有在构造函数部分提到访问修饰符。
所以问题是双重的:访问修饰符在应用于构造函数时会做什么(如果它根本不做任何事情),以及如何隐藏构造函数?
构造函数上的访问修饰符与其他地方的访问修饰符完全相同......但要记住的关键是在 D 中,访问控制仅适用于 模块 之外。同一个模块中的所有内容也可以看到其中的所有其他内容,但私有 ctor 会阻止模块外的构造。
这与许多其他编程语言不同。这个想法是 D 模块让你定义助手 类 而不需要像 C++ 的 friend
功能。
假设我有以下代码:
class Foo
{
private this(int x){ }
}
void
main()
{
auto f = new Foo(4);
}
令我惊讶的是,这实际上可以编译。我希望私有构造函数在其定义的 class 之外无法使用,就像方法一样,但事实显然并非如此。语言参考甚至没有在构造函数部分提到访问修饰符。
所以问题是双重的:访问修饰符在应用于构造函数时会做什么(如果它根本不做任何事情),以及如何隐藏构造函数?
构造函数上的访问修饰符与其他地方的访问修饰符完全相同......但要记住的关键是在 D 中,访问控制仅适用于 模块 之外。同一个模块中的所有内容也可以看到其中的所有其他内容,但私有 ctor 会阻止模块外的构造。
这与许多其他编程语言不同。这个想法是 D 模块让你定义助手 类 而不需要像 C++ 的 friend
功能。