所以我和一位同事就一段代码进行了友好的争论:
public sealed class NewObject
{
private string _stuff = string.Empty;
public string Stuff
{
get { return GetAllStuff(); }
}
private string GetAllStuff()
{
//Heavy string manipulation of _stuff
}
public NewObject(string stuffToStartWith)
{
_stuff = stuffToStartWith;
}
public static NewObject operator +(NewObject obj1, NewObject obj2)
{
if (obj1 == null)
throw new ArgumentNullException();
if (obj2 == null)
throw new ArgumentNullException();
NewObject result = new NewObject(string.Empty);
result._stuff = String.Concat(obj1._stuff, obj2._stuff);
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
争论在于操作员覆盖.我的同事认为,除了构造函数之外,设置私有字段的值不是最好的编程习惯.我的同事提出的解决方案是重构Stuff属性的名称AllStuff并添加一个属性Stuff,它具有getAND set访问器并Stuff在操作符覆盖中使用新属性.看起来像这样:
public static NewObject operator +(NewObject obj1, NewObject obj2)
{
if (obj1 == null)
throw new ArgumentNullException();
if (obj2 == null)
throw new ArgumentNullException();
NewObject result = new NewObject(string.Empty);
result.Stuff = String.Concat(obj1.Stuff, obj2.Stuff);
return result;
}
Run Code Online (Sandbox Code Playgroud)
我不同意.我觉得第一种方式更好,因为它使属性在类外保持只读.我的问题是,哪种方式是面向对象设计的最佳实践?
你可以private set在属性上给自己一个(在允许你使用属性语法的同时保留可见性或缺乏可见性),但这并没有真正解决这一点.
在课堂上,我说变量是公平的游戏.在外面的任何地方,包括继承的类,应该get和set属性,但在声明的类中,我说可以分配私有成员.