是一种虚拟方法,其唯一目的是修改私有变量明智的设计

本文关键字:修改 变量 唯一 一种 方法 虚拟 | 更新日期: 2023-09-27 18:36:59

oo 设计基础知识在这里...

编辑:在第一个回答后澄清 - 我不是在问如何解决这个问题,而是从表面上看设计是否看起来很糟糕。 出于社会考虑,我不想指出原始代码。

我正在使用一些具有虚拟方法的代码,该方法除了修改类的私有成员变量外什么都不做。 我想更改该修改的细节。 这是我唯一想要更改的行为,但我无法引用私有成员,因此我不能只重写该方法。 从表面上看,原作者的设计是错误的/奇怪的,还是这还不足以说明?

public class X
{
    private List<string> InterestingThings = new List<string>();
    public virtual void MethodIWantToOverride(string rawData)
    {
         string fixedData = ... 
         // do some fancy stuff to clean up data that I want to come thru 'dirty'
         InterestingThings.Add(fixedData);
    }
 }

是一种虚拟方法,其唯一目的是修改私有变量明智的设计

它需要定义为protected变量,而不是private,以便virtual方法对其进行修改。

我建议进行此更改并将该方法保留为 virtual ,因为这可以保证您不会破坏此类之外的任何内容。原始开发人员可能打算重写派生类中的虚拟方法。如果您无法知道或测试这种情况,则将该方法保留为 virtual 并将private成员更改为 protected

有关虚拟方法的更多阅读,请单击此处

如果代码的目的是对添加到列表中的项目强制实施一些不变性,则要求所有向列表添加项目的尝试都通过虚拟方法来实现这一点。 将列表字段公开为 protected将允许派生类违反基类不变量。 如果这就是您要做的,并且如果您要维护代码实际依赖的不变量的所有部分,则可以将列表字段设为protected,但我建议您至少考虑添加另一个受保护的,可能的虚拟基类方法,以维护较弱的不变量的方式对其进行更改。

将属性保留为私有可确保只有包含类才能看到它。将其设置为受保护将允许派生类查看和使用它。如果需要派生类来重写需要访问此属性的方法(如上所述),则必须使属性和方法(至少)受到保护。