为什么可以为私有类型创建 public 别名?

Why can you create a public alias to a private type?

为什么可以为私有类型创建 public 别名?

我似乎无法理解为什么授予这样的功能以及它是功能还是错误。

举个例子。

foo.d

module foo;

private class Foo { }

public alias NewFoo = Foo;

main.d

import foo;

void main() {
    auto foo = new NewFoo;

    // Foo can be used ...
}

我知道,如果您不希望 Foo 可用,那么您必须将构造函数声明为私有的,并且可能是 Foo.

的所有成员

此外,如果尝试直接使用 Foo,那么编译器会报错,就像我认为当它看到 public 别名指向私有类型时会发生的那样。

我原以为编译器实际上不允许这种事情发生,但我想情况并非如此。

所以我的问题是为什么编译器不抱怨这样的用法以及这个功能背后的确切原因是什么?

这样的构造让您可以隐藏模块功能的实现,并且在公开一个 class 之后您就不会绑定到一个名称 - 您可以随时更改它,除非您导出正确的别名。

如您所见,编译器没有理由抱怨。