使用基类方法返回值?

6

我在基类中有一个返回bool类型的方法,我希望这个bool值可以决定派生类中同名覆盖方法的行为。

基类:

    public bool Debt(double bal)
    {
        double deb = 0;
        bool worked;

        if (deb > bal)
        {
            Console.WriteLine("Debit amount exceeds the account balance – withdraw cancelled");
            worked = false;
        }
        else

        bal = bal - deb;
        worked = true;

        return worked;
    }

派生
public override void Debt(double bal)
    {
        // if worked is true do something

    }

请注意,bal来自我之前创建的构造函数。

1
确保你的基类方法是虚拟的:public virtual bool Deb(double bal),否则你的派生类只会隐藏它。这只是一个小提示。 - Jason Down
4
返回值类型必须匹配,否则会出现编译错误:'<namespace>.Derived.Debt(double)':返回类型必须为'bool'以匹配重写成员'<namespace>.Base.Debt(double)'。 - Richard Walters
4个回答

10

您可以使用 base 关键字来调用基类方法:

public override void Debt(double bal)
{
    if(base.Debt(bal))
        DoSomething();

}

如上面的评论所示,您需要确保基类中存在与派生类中相同的签名(返回类型和参数)的虚方法,或从派生类中删除override关键字。


1
最好在if之后加上括号并在那里处理,而不是调用另一个方法来处理。为什么要让调用栈比必要的更深呢? - Jeff
@Jeff - 我在那里放置方法调用纯粹是为了表示应该在那里发生某些事情。它也可以是内联语句。 - PHeiberg
我明白你的意思,只是没有办法判断结果是真还是假。 - TheAce
@TheAce:它在一个if语句内部。if评估基类方法的返回值。如果你进入了if检查,那么它是真的。否则,它是假的。 - Jeff

2
if(base.Debt(bal)){
    // do A
}else{
    // do B
}

base 指的是基类。因此,base.X 指的是基类中的 X


2

调用base方法:

public override void Debt(double bal)
{
    var worked = base.Debt(bal);
    //Do your stuff
}

1

正如其他人所提到的,您可以使用base.Debt(bal)调用基类方法。我还注意到您的基类方法没有声明为虚拟的。C#方法默认情况下不是虚拟的,因此,除非在基类中将其指定为虚拟的,否则您将无法在派生类中重写它。

//Base Class
class Foo
{
    public virtual bool DoSomething()
    {
        return true;
    }
}

// Derived Class
class Bar : Foo
{
    public override bool DoSomething()
    {
        if (base.DoSomething())
        {
           // base.DoSomething() returned true
        }
        else
        {
           // base.DoSomething() returned false
        }
    }
}

这里是MSDN关于虚方法的介绍


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接