私人或受保护的变量?

JD *_*cks 8 oop

我目前正在阅读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"重构.