D 为什么可以为私有类型创建公共别名?

D 为什么可以为私有类型创建公共别名?,d,D,为什么可以为私有类型创建公共别名 我似乎无法理解为什么授予这样的功能,以及它是一个特性还是一个bug 比如说 食品与药物 main.d 我知道,如果您不希望Foo可用,那么必须将构造函数声明为私有的,并且可能是Foo的所有成员 另外,如果有人试图直接使用Foo,编译器就会抱怨,就像我想象的那样,当它看到公共别名指向私有类型时会这样做 我本以为编译器实际上不允许这种事情,但我想情况并非如此 所以我的问题是,为什么编译器不抱怨这种用法,以及这种功能背后的确切原因是什么?这种构造允许您隐藏模块功能的实

为什么可以为私有类型创建公共别名

我似乎无法理解为什么授予这样的功能,以及它是一个特性还是一个bug

比如说

食品与药物

main.d

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

另外,如果有人试图直接使用
Foo
,编译器就会抱怨,就像我想象的那样,当它看到公共别名指向私有类型时会这样做

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


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

这种构造允许您隐藏模块功能的实现,并且在公开一个类之后,您不必绑定到一个名称,您可以随时更改它,除非您导出正确的别名


因此,正如您所看到的,编译器没有理由抱怨。

可能的一个潜在用例是,当您提前知道实现将发生变化时。然后,您只需将别名行更改为
public alias StableFoo=MyNewFoo这与许多语言允许您为私有字段编写公共getter/setter的原因相同。这是一些社区的常见做法,有时甚至有很好的理由。
module foo;

private class Foo { }

public alias NewFoo = Foo;
import foo;

void main() {
    auto foo = new NewFoo;

    // Foo can be used ...
}