2010-06-18 399 views
0
interface IFoo 
{ 
    int MyReadOnlyVar { get; } 
} 


class Foo : IFoo 
{ 
    int MyReadOnlyVar { get; set; } 
} 


public IFoo GetFoo() 
{ 
    return new Foo { MyReadOnlyVar = 1 }; 
} 

以上是實現readonly/immutable對象的可接受方式嗎?的IFoo的不變性可以用一個臨時演員到富被打破。隱藏接口的方法

通常(非關鍵的)的情況下,就隱藏通過接口功能的通用模式?或者它被認爲是懶惰的編碼?甚至是反模式?

回答

1

使用接口隱藏使類更小的接口是正確用法。我在Spring應用程序中看到很多這樣的代碼,其中依賴關係僅在類中表示(並且由Spring依賴注入使用),而不是在接口中,因爲它們不提供任何域。

你不能保護你的代碼與其他程序員。如果您擔心有人會將界面轉換爲可變版本,如果您返回一個真正的只讀快照,並且團隊中的某個人爲其添加了變異方法,則可能會發生同樣的情況。

這也取決於你的代碼。在一個項目/應用程序內,你可能會相信你的同事。在開發框架時,事情是不同的。然後,你必須決定是否返回「保存」對象,例如列表的克隆而不是可能被修改的真實列表。

所以是的,在一般情況下(非關鍵)的情況下恕我直言,這是適當的做你的方式。

0

您可以將Foo類的組件級別(在C#內部)可見,或使內部MyReadonlyVar的二傳手,讓你的代碼將組件外部不必要的鑄件進行保護。