2015-10-01 11 views
0

鑑於可用的accessibility Levels,是否有任何模式或適當的方法來使A類只能從B類和C類訪問,反之亦然(A類,B類和C類之間沒有繼承關係)? (最好在編譯時)有多少個類只能彼此訪問?

A,B和C是兄弟姐妹,位於相同的命名空間。

到目前爲止,想到的唯一的事情就是:

  • 使用反射來確定調用類,並拋出異常時(Runtime)
  • 巢類(使用一個基類),並使用protected修改

後者似乎是最好的方法,但有沒有其他方法?我正在尋找類似InternalsVisibleTo的東西,但在組件中。

+0

「朋友」是否存在?那甚至會做他在問什麼? – Almo

+0

@Almo'朋友'是'internal'的VB等價物' –

+0

@JamesThorpe不能總是相信類不是「_referenced其他地方」,所以我認爲我更喜歡使用基類解決方案。我希望避免包含三個類的項目。謝謝! – Marcus

回答

2

那麼你可以創建具有三類私人嵌套類含有類:

public class O 
{ 
    private class A { private void Test() {B b = new B(); C c = new C(); }} 
    private class B { private void Test() {A a = new A(); C c = new C(); }} 
    private class C { private void Test() {B b = new B(); A a = new A(); }} 
} 

public class Hacker 
{ 
    O.A a = new O.A(); // fail 
} 

注意嵌套類並不意味着任何形式的繼承關係 - 它純粹用於可訪問性目的。

但是,如果三個班級不能在他們的小圈子之外訪問,那麼這三個班級有什麼意義呢? 使用那些類?

+1

「但是如果他們不能在他們的小圈子之外訪問,這三個類的意義何在?」他們可以實現接口,但是你希望其他人不要直接構造或引用它們。 – weston

+1

@weston,但是_something_必須創建它們。這個問題措辭的方式聽起來像這三個人在一個沒有與大陸通信的荒島上。 –

+0

嗯,是的,我同意,你需要一些非私有的東西,比如你的例子中的「O」。 – weston

1

最嚴格的你可以得到(雖然仍然能夠從其他類中看到它)是internal但是如你所知,該程序集中的任何類都可以看到該類。

這將是很高興有像Java包私人的東西,這是私人的,除了該包(名稱空間)的其他成員,但唉,C#沒有。

然而,你可以安排你的組件來執行這樣的:

相反的:

Assembly 
    -internal A 
    -B (uses A) 
    -C (uses A) 
    -D (uses the public classes of Assembly1, but can also see A) 

它們分開來:

Assembly1 
    -internal A 
    -B (uses A) 
    -C (uses A) 
Assembly2 
    -references Assembly1 
    -D (uses the public classes of Assembly1, can't see A) 

你不能有一個循環引用,一點都不像他們都共享一個程序集,這會強制從Assembly2到Assembly1的依賴方向。

相關:I'd like a warning about circular namespace dependency