如何在c#中解决以下方法问题

时间:2012-11-06 22:56:08

标签: c#

我的主要内容是:

static void Main(string[] args)
    {
        Money m1 = new Money(2315.99);

        Money m2 = new Money(4000, 25);

        Console.WriteLine(m1);
        Console.WriteLine(m2);

        Console.WriteLine(m1.IncrementMoney(m2));
    }



    public void IncrementMoney(Money x)
    {
        //what do I put in here?
    }

所以  
Money m1 = new Money(2315.99);
应该将2315.99变成“$ 2315.99”

Money m2 = new Money(4000, 25);
表格“$ 4000.25”

我在Money课程中完成了所有这些工作并且工作正常。

现在我应该做的是将这两个一起使用      
m1.IncrementMoney(m2);

这是我的“金钱”课程

class Money
{

    //instance variables
    private int dollars;
    private int cents;


    double amount;


    public int Dollars
    {
        get { return dollars; }
        set
        {
            if (value > 0)
                dollars = value;
        }
    }



    public int Cents
    {
        get { return cents; }
        set
        {
            if (value > 0)
                cents = value;
        }
    }



    public Money(int Dol, int Cen)
    {
        Dollars = Dol;
        Cents = Cen;

        double Dollar = Convert.ToDouble(Dollars);
        double Cent = Convert.ToDouble(Cents);

        amount = Dollar + (Cent / 100);

    }


    public Money(double am)
    {
        int dol = Convert.ToInt32(am);

        if (dol > am)
            Dollars = dol - 1;

        else if (dol < am)
            Dollars = dol;
        //Dollars

        double cen = am % 1;

        cen = cen * 100;

        Cents = Convert.ToInt32(cen);
        //Cents

        double Dollar = Convert.ToDouble(Dollars);
        double Cent = Convert.ToDouble(Cents);

        amount = Dollar + (Cent / 100);
    }

    //override ToString()
    public override string ToString()
    {
        return string.Format("{0:c}", amount);
    }


}//end class Money

但我不知道将什么放入IncrementMoney方法。
请帮帮忙?
如果不是太麻烦,也许对它是如何工作有点了解?我真的很想知道。

很抱歉,如果我没有提供足够的信息,
如果有任何其他要求,请告诉我。
谢谢!

3 个答案:

答案 0 :(得分:1)

由于IncrementMoney应该将两个货币值加在一起,因此您的用法应该是Money类型的extension method。这很好,因为扩展方法非常棒。这个网站上的一个常见笑话是,它们是一切的解决方案。

您的代码应类似于:

public static Money IncrementMoney(this Money x, Money y)
{
   var totalCents = x.Cents + y.Cents;
   var retCents = totalCents / 100;
   var retDollars = x.Dollars + y.Dollars + (totalCents % 100)
   return new Money(retDollars, retCents);
}

至于快速解释......

通过向第一个参数添加this,我们告诉C#我们要编写扩展方法。这意味着我们正在编写的这个方法将挂起this参数的类型(在本例中为Money)并允许我们使用它,就像它始终在.NET框架中一样。扩展方法必须是静态的,因此您不能使用该修饰符。除此之外,您只需编写一种方法来完成您的任何操作,就像您通常那样!

我建议您将其命名为IncrementMoney以外的其他内容。这不是很具描述性。 AddMoney会更好。

顺便说一句,您也可以查看operator overloading。您可以调整我刚刚编写的内容,只需使用+运算符执行完全相同的操作,如下所示:

public static Money operator +(Money x, Money y)
{
   var totalCents = x.Cents + y.Cents;
   var retCents = totalCents / 100;
   var retDollars = x.Dollars + y.Dollars + (totalCents % 100)
   return new Money(retDollars, retCents);
}

通过此定义,您只需转到m1 + m2并将它们添加到一起。

答案 1 :(得分:0)

public void IncrementMoney(Money x)
{
    this.Dollars += x.Dollars;

    var newCents = this.Cents + x.Cents;
    this.Cents = newCents % 100;

    this.Dollars += newCents / 100;
}

我实际上将函数命名为Add,因为您正在获取当前值并添加提供的值,并且不需要Money修饰符,因为它应该在Money类上并且接受Money对象

答案 2 :(得分:0)

首先,这一行:

Console.WriteLine(m1.IncrementMoney(m2));

表示IncrementMoney应该返回一些内容,但现在它返回void

所以看起来应该是这样的:

public void IncrementMoney(ClassA x)
{
    this.Value += x.Value;
}

然后显示:

ClassA m1 = new ClassA(2315.99);

ClassA m2 = new ClassA(4000, 25);

Console.WriteLine(m1);
Console.WriteLine(m2);

m1.IncrementMoney(m2);

Console.WriteLine(m1);