我需要類的受保護屬性版本。這意味着外部類不能改變值,但是固有類可以。僅適用於非固有類的類的只讀版本
這裏是一個示例代碼,正如你所看到的,我使用的是「臭布爾解決方案」。我應該如何以更優雅的方式做到這一點?我希望這個問題有一些很好的模式解決方案。
EDIT由於大量的「保護套」的答案:
這樣做,我會無法設置非固有類的類屬性和構造函數的過程IsReadOnly屬性和價值將是無用的。
public class Foo1
{
protected bool smellyBoolSolution = false;
public bool IsReadOnly { get; private set; }
private int x;
public int X
{
get { return x; }
set
{
CheckCanWrite();
x = value;
}
}
public Foo1(bool isReadOnly)
{
IsReadOnly = isReadOnly;
}
private void CheckCanWrite()
{
if (IsReadOnly && !smellyBoolSolution)
throw new InvalidOperationException("Class is read only.");
}
}
public class Foo2 : Foo1
{
public Foo2()
: base(true)
{
}
public void DoStuff()
{
int newX = 1;
//.... calculates new x
//Oh, using the smelly bool solution I can change my base class properties
base.smellyBoolSolution = true;
base.X = newX;
base.smellyBoolSolution = false;
}
}
//Usage
public class Foo3
{
public void DoStuff()
{
//Foo1 in writable version
Foo1 f = new Foo1(false);
f.X = 1;
//Foo2 inherents Foo1 and only Foo2 can change X
Foo2 f2 = new Foo2();
f2.X = 1; //Exception here.
}
}
你的問題是什麼? –
你的第一個陳述描述了「私人」......爲什麼你需要更多的東西? –
IsReadOnly可能爲false,所以其他類可以將此對象用作可寫的版本。 – Pedro77