我目前正在阅读Code Complete,McConnell强烈建议将所有变量设为私有.Coincedentally我正好在一个我需要更改私有变量的项目上工作.
该类有一个私有变量(a String)告诉它从哪里加载图像以在系统chrome中使用.我需要更改此图像,我不知道其他语言,但就我所知,在Flex/AIR中,没有办法覆盖私有变量.
如果它已被声明为protected,我可以简单地扩展该类,并覆盖该变量.但由于它是私有的,我不得不从类中复制所有代码并创建一个重复的类,唯一的区别就是字符串.
我认为参数是使用私有,因为它使得超级和子类之间的松散耦合,但是我不得不完全违反DRY才能实现简单的字符串更改,这在我看来更糟糕.
这让我觉得受保护比私有更好.但是,我想以正确的最佳实践方式做事.因此,如果私有更好,我想了解原因.
如果普遍的共识是私人更好,有人能解释为什么吗?
Joh*_*ers 26
在这种情况下,该映像的位置曾经是基类的特定于实现的私有功能.您的新要求意味着它需要能够从一个派生类变为另一个派生类.
您应该将成员字段保持为私有,但定义受保护的虚拟属性以将其公开给派生类:
private const string _defaultImagePath = @"C:\whatever.bmp";
protected virtual string ImagePath {
get {return _defaultImagePath;}
}
Run Code Online (Sandbox Code Playgroud)
在想要更改它的派生类中:
private const string _myImagePath = @"C:\other.bmp";
protected override string ImagePath {
get {return _myImagePath;}
}
Run Code Online (Sandbox Code Playgroud)
您还需要更改基类,以便在需要图像路径时使用该属性,而不是使用该字段.这是"Encapsulate Field"重构.