2016-12-28 71 views
2

爲什麼可以創建一個私有類型的公共別名?爲什麼你可以創建一個私有類型的公共別名?

我似乎無法把握爲什麼這樣的功能是理所當然的,無論是功能還是一個bug。

舉個例子。

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,那麼編譯器會抱怨,就像我認爲它會在公共別名指向私有類型時所做的那樣。

我本來期望編譯器實際上不允許這種事情,但我想這是不是這樣的。

所以我的問題是,爲什麼不編譯器抱怨這種用法和究竟什麼是這背後的功能的原因是什麼?

+1

也許潛在的用例之一是當你知道實現將改變時。您唯一需要做的就是將別名行更改爲'public alias StableFoo = MyNewFoo;' – DejanLekic

+1

許多語言允許您爲私有字段編寫公共getter/setter。這在一些社區是很常見的做法,偶爾還有一個很好的理由。 – rcorre

回答

4

這樣的設計可以讓你隱藏實現的模塊的功能和暴露你是不依賴於一個名稱的類之後 - 你可以隨時改變它你想,除非您導出正確的別名。

所以你可以看到,我們沒有理由對編譯器的抱怨。

相關問題