我们可以让一个类的属性可以公开看到,但只能被某些特定的类修改?
例如,
// this is the property holder public class Child { public bool IsBeaten { get; set;} } // this is the modifier which can set the property of Child instance public class Father { public void BeatChild(Child c) { c.IsBeaten = true; // should be no exception } } // this is the observer which can get the property but cannot set. public class Cat { // I want this method always return false. public bool TryBeatChild(Child c) { try { c.IsBeaten = true; return true; } catch (Exception) { return false; } } // shoud be ok public void WatchChild(Child c) { if( c.IsBeaten ) { this.Laugh(); } } private void Laugh(){} }
孩子是一个数据类,
父类是可以修改数据的类,
猫是一个只能读取数据的类.
有没有办法使用C#中的Property实现这种访问控制?
解决方法
而不是暴露Child类的内部状态,而是可以提供一个方法:
class Child { public bool IsBeaten { get; private set; } public void Beat(Father beater) { IsBeaten = true; } } class Father { public void BeatChild(Child child) { child.Beat(this); } }
然后猫不能打败你的孩子:
class Cat { public void BeatChild(Child child) { child.Beat(this); // Does not compile! } }
如果其他人需要能够击败孩子,请定义他们可以实现的界面:
interface IChildBeater { }
然后让他们实现它:
class Child { public bool IsBeaten { get; private set; } public void Beat(IChildBeater beater) { IsBeaten = true; } } class Mother : IChildBeater { ... } class Father : IChildBeater { ... } class BullyFromDownTheStreet : IChildBeater { ... }