2010-12-11 171 views
2

也許我失去了一些東西,但不應該C#有方法的外部訪問修飾符?即一個修飾符,使方法公開,但只爲其他類,即方法不能被類本身調用?爲什麼沒有「外部」訪問修飾符?

對於諸如公共方法這樣的事情來說,這不會有用嗎?這些公共方法可以通過鎖定來確保鎖定不會從類中重新獲取?

+0

有一個'extern'關鍵字,但它不用於你描述的。 http://msdn.microsoft.com/en-us/library/e59b22c5%28v=vs.80%29.aspx – Nobody 2010-12-11 15:59:20

+9

這隻對有多重人格障礙的程序員有用。如果你想要一個類不可訪問的方法,把它們放在一個不同的類中。通過設計,oop類應該可以訪問和控制類中包含的方法和數據。 – ja72 2010-12-11 16:22:50

回答

5

顯式實現的接口方法可能是最接近你想要的。當然,如果一個類將this轉換爲接口類型,它仍然可以自己調用它們。

+0

其實,我認爲其他答案比較好。我打算大肆宣傳你不應該需要這種行爲,但是提出一個聰明的解決方案的誘惑太大了。 – siride 2010-12-11 16:43:43

+0

[Progress](http://msdn.microsoft.com/en-us/library/hh193692.aspx)和[IProgress](http://msdn.microsoft.com/zh-cn/library/hh138298.aspx )接口是一個很好的使用這個的好例子。 'IProgress .Report'是一個私人成員,所以創建'Progress '類的任何人都不會看到Report()方法,但所有接受'IProgress接口'的用戶都可以調用Report() '回電話的方法。 – 2013-07-03 14:09:41

3

我認爲這沒有用。沒有定義任何需求的範例。

在你的例子中:即使有external關鍵字你如何確保在不釋放鎖的情況下不能在外部重新輸入鎖?

類之間有合同,而且類總是與自己簽訂合同。我認爲沒有關鍵字可以幫助避免這種編程錯誤。在這個特定的例子中,類應該根據其使用級別適當地實現鎖定。

+0

我不知道,我認爲語法澄清代碼的意圖,並確保某些行爲通常是一件好事,這就是爲什麼我們有像readonly關鍵字的東西。沒有理由爲什麼一個班級不能與自己簽訂「合同」 – Homde 2010-12-12 17:00:15

8

不需要它。訪問控制用於限制對來自不受信任的客戶端代碼的成員的訪問。

請記住,在OOP中,一個類表示一個自主的,自包含的代碼單元,並且隱含地假定它是自洽的。

如果你不能相信自己班裏的代碼不會導致重入,那麼你可以信任什麼?用語言特徵來防範每一種可能的可能性是不切實際的;有時它只是作爲開發人員來確定你自己的代碼的工作:)