虚拟方法逻辑不工作C#.NET 4.0

虚拟方法逻辑不工作C#.NET 4.0,c#,methods,virtual,C#,Methods,Virtual,我正在阅读《代码》一书中的一个例子和.NET平台,我犯了一个我看不见的错误。程序编译并运行,但本例中的Manager对象没有返回正确的'StockOptions'值。为了简洁起见,我将尝试只发布相关代码,因为这个示例都是关于类层次结构的,并且有六个不同的类。Employee类中的虚拟方法GiveBonus未在Manager类中正确重写 class Manager : Employee { private int numberOfOpts; //the properties are

我正在阅读《代码》一书中的一个例子和.NET平台,我犯了一个我看不见的错误。程序编译并运行,但本例中的
Manager
对象没有返回正确的'StockOptions'值。为了简洁起见,我将尝试只发布相关代码,因为这个示例都是关于类层次结构的,并且有六个不同的类。
Employee
类中的虚拟方法
GiveBonus
未在
Manager
类中正确重写

class Manager : Employee
{
    private int numberOfOpts;
    //the properties are inherited from Employee

    public int StockOptions { get; set; }

    //***METHODS*** this is returns the StockOptions amount as it is in the
    //  constructor, there's no logic being applied
    public override void GiveBonus(float amount)
    {
        base.GiveBonus(amount);
        Random r = new Random();
        numberOfOpts += r.Next(500);    
    }

    public override void DisplayStats()
    {
        base.DisplayStats();
        Console.WriteLine("you have {0} stock options", StockOptions);
    }

    public Manager() { }


    public Manager(string fullName, int age, int empID, float currPay, 
        string ssn, int numbofOpts) : base(fullName, age, empID, currPay, ssn)

    {
        ID = empID;
        Age = age;
        Name = fullName;
        Pay = currPay;
        StockOptions = numbofOpts;
    }
}
my Main()方法的代码段

我问这个问题时犯了一个错误。我应该问的是为什么我必须使用

Console.WriteLine("you have {0} stock options", numbOfOpts);
而不是

Console.WriteLine("you have {0} stock options", StockOptions);

这并不是要将一个随机数加到9000,而是要给出一个随机数的股票期权以及“基本”奖金:

public override void GiveBonus(float amount)
{
    base.GiveBonus(amount);
    Random r = new Random();

    // Note numberOfOpts, not currPay
    numberOfOpts += r.Next(500);
}

不幸的是,由于我们有两个单独的字段——一个是由自动实现的属性创建的——它实际上不会更新
StockOptions
的值。。。现在还不清楚这是由于你的编辑,还是书中的错误。(这个代码还有很多其他我不喜欢的地方,但是嘿…)

它不是要给9000加一个随机数-它是要给一个随机数的股票期权以及“基本”奖金:

public override void GiveBonus(float amount)
{
    base.GiveBonus(amount);
    Random r = new Random();

    // Note numberOfOpts, not currPay
    numberOfOpts += r.Next(500);
}

不幸的是,由于我们有两个单独的字段——一个是由自动实现的属性创建的——它实际上不会更新
StockOptions
的值。。。现在还不清楚这是由于你的编辑,还是书中的错误。(关于这段代码,我还有很多不喜欢的地方,但是嘿…

它实际上在书中:)。当我将
StockOptions
更改为类中的字段时,
numberOfOpts
返回一个随机数。那么,在这样的实现中,私有支持字段将永远不会更新?你能解释一下你为什么不喜欢这个代码吗?我只是在学习所有这些东西,这是直接从马口中学来的。@wootscootinboogie:backing
StockOptions
的字段肯定不会通过设置不同的字段自动更改,不。哦,亲爱的。至于其他问题-名称很糟糕,无参数构造函数似乎是个坏主意,没有验证,我希望各种属性由基本构造函数设置(大多数情况下是不可变的)。如果上面的评论也是逐字逐句的,那就没有意义了。嗯,基本上。我编辑这个问题是为了反映我应该问的问题。代码是逐字逐句的,但注释是我可怜的尝试,上帝知道是什么。它实际上在书中:)。当我将
StockOptions
更改为类中的字段时,
numberOfOpts
返回一个随机数。那么,在这样的实现中,私有支持字段将永远不会更新?你能解释一下你为什么不喜欢这个代码吗?我只是在学习所有这些东西,这是直接从马口中学来的。@wootscootinboogie:backing
StockOptions
的字段肯定不会通过设置不同的字段自动更改,不。哦,亲爱的。至于其他问题-名称很糟糕,无参数构造函数似乎是个坏主意,没有验证,我希望各种属性由基本构造函数设置(大多数情况下是不可变的)。如果上面的评论也是逐字逐句的,那就没有意义了。嗯,基本上。我编辑这个问题是为了反映我应该问的问题。代码是逐字逐句的,但注释是我可怜的尝试,上帝知道是什么。