2011-11-23 48 views
0

在C++中,可以將函數傳遞給一個常量爲const的對象。這迫使代碼將該對象視爲「只讀」(忽略了可以使用強制轉換去除常量的事實)。我試圖用C#來做同樣的事情。我有一個用戶將實現的界面。其中一個方法將被賦予一個對象作爲參數。如何在方法範圍內使對象爲'const',否則爲可變。將C#中的Const對象作爲參數

解決方案:接口。我做了一個界面,其中唯一可用的屬性是'get'。

public interface IVal { ... } 


public interface IFoo 
{ 
    IVal Val { get; } 
} 

public class Foo : IFoo 
{ 
    public IVal Val { get; } 
} 

我通過界面傳遞,一切都很神奇。但是,在我的具體課上,我想有一個「設置」可用。這將允許我設置具體的類價值。我的具體課程會如何?

我在考慮使用'internal'關鍵字。我讀到它暴露了方法/屬性在你自己的程序集中編碼。這是我的答案嗎?

編輯:爲了更好地說明這一點,我添加了一個可以自動爲我施放的setter。然而,對於每個屬性,這是一個很大的但卻難免重複碼:

private Val _val; 
public IVal Val 
{ 
    get { return this._val; } 
    set { this._val = value as Val; } 
} 
+0

有這樣的一個二傳手可能是一個壞主意。如果我嘗試將它設置爲不是'Val'的東西,它會默默地將其設置爲'null'。這不是大多數人所期望的。你應該決定是否要'Val'或'IVal'並堅持下去。 – svick

回答

3

你可以只添加set,它會很好地工作:

public IValue Value { get; set; } 

這樣,你可以設置的值,如果你有Foo,但如果您有IFoo,則不能。類似於C++的情況,如果你有IFoo,你可以投到Foo(只要對象實際上是Foo),然後使用setter。

另一種選擇是使二傳手protectedprivate

public IValue Value { get; private set; } 

這樣就可以確保只有在這個類代碼(或在protected的情況下繼承歸類),可以設置該屬性。

關於internal:是的,它暴露了成員僅在同一個程序集(和朋友程序集)中的代碼。但這並不常用。如果您沒有指定該類爲public,則使用(和有用)的內部類型即使是默認值也是如此。

這可以幫助你解決你的問題。如果您製作Foointernal,則其他裝配中的方法IFoo將無法​​設置該屬性,即使在投射時也是如此。

當然,代碼總是可以使用反射來設置屬性。但你大部分時間都不應該擔心。

+0

如果我要爲此設置一個值,那麼我必須投射到界面。 this.Value = new Value();導致一個錯誤,迫使我每次分配時都要進行一次演員表演。這是我最大的抱怨,有沒有更好的方法呢? – MarkP

+0

'this.Value = something' should be fine fine without casting。 – svick

+0

我得到錯誤'不能隱式轉換從Val到IVal ...' – MarkP

1

你可以做similiar事情

public class ReadonlyTestClass { 
private readonly object _name; 
public ReadonlyTestClass(object name) { 
    _name = name; 
} 
public object Name {get { return _name; }} 
} 

或者

public class ReadonlyTestClass { 
public ReadonlyTestClass(object name) { 
    this.Name = name; 
} 
public object Name {get; private set;} 
} 
+0

我希望'set'可以在課堂外提供給我的其他班級。我希望它能夠隱藏在另一個人的課堂上。 – MarkP

相關問題