0

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);
    }
 }
4

3 回答 3

3

它需要被定义为一个protected变量而不是private一个virtual方法来修改它。

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

更多关于虚拟方法的阅读在这里

于 2012-06-12T15:14:44.673 回答
0

将属性保留为私有可确保只有包含类才能看到它。将其设置为受保护将允许派生类也可以查看和使用它。如果您需要派生类来覆盖需要访问此属性的方法,就像上面所做的那样,您必须使属性和方法(至少)受到保护。

于 2012-06-12T15:33:11.030 回答
0

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

于 2012-06-12T18:46:20.950 回答