Невозможно использовать значения конструктора нового класса, которые будут перезаписывать значения по умолчанию в С#

Я написал некоторый код, чтобы взять пять номеров социального страхования, пять записей о валовом доходе и рассчитать налог за каждого. Программа будет использовать значения по умолчанию для лимита доллара, низкой ставки и высокой ставки для расчета налога. Но это также позволит пользователю выбрать, хочет ли он использовать свой собственный лимит в долларах, низкую ставку и высокую ставку для расчета налога, причитающегося за выбранного налогоплательщика.

Проблема: каждый раз, когда я ввожу свой собственный лимит в долларах, низкую ставку и высокую ставку для расчета налога, он по-прежнему использует значения по умолчанию (предел = 30000, низкая ставка = 0,15 и высокая ставка =.28). И это то, как получить неправильные расчетные налоговые значения.

Вопрос. Может быть, потому что мой "public static void GetRates (int income)" не имеет типа возврата (он недействителен)? Должен ли я возвращать значение на главную после того, как я назову "Taxpayer.GetRates(taxPayer [x].grossIncome"; метод?

Часть кода

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace assignment
{ public class Rates { public int incomeLimit; // income limit public ****** lowTaxRate; // low tax rate public ****** highTaxRate; // high tax rate public int IncomeLimit // read only property { get { return incomeLimit; } } public ****** LowTaxRate // read only property { get { return lowTaxRate; } } public ****** HighTaxRate // read only property { get { return highTaxRate; } } public Rates() { DoRates(); } public void DoRates() // class constructor that assigns default values { // set default values for limit, lowRate, and highRate incomeLimit = 30000; lowTaxRate = .15; highTaxRate = .28; } public void DoRates(int limit, ****** lowRate, ****** highRate) // class constructor that takes three parameters { incomeLimit = limit; lowTaxRate = lowRate; highTaxRate = highRate; } // CalculateTax method that takes an income parameter and computes the tax public int CalculateTax(int income) { int taxOwed = 0; if (income < incomeLimit) { taxOwed = Convert.ToInt32(income * lowTaxRate); } if (income >= incomeLimit) { taxOwed = Convert.ToInt32(income * highTaxRate); } return taxOwed; } } public class Taxpayer : IComparable { string socialSecurityNum; int grossIncome; int taxOwed; // Use get and set accessors. public string SocialSecurityNum { get { return socialSecurityNum; } set { socialSecurityNum = value; } } // Use get and set accessors. public int GrossIncome { get { return grossIncome; } set { grossIncome = value; } } // Use read-only accessor public int TaxOwed { get { return taxOwed; } } // objects are comparable to each other based on tax owed. int IComparable.CompareTo(Object o) { int returnVal; Taxpayer temp = (Taxpayer)o; if (this.taxOwed > temp.TaxOwed) returnVal = 1; else if (this.taxOwed < temp.TaxOwed) returnVal = -1; else returnVal = 0; return returnVal; } public static void GetRates(int income) { int incomeLimit; ****** lowRate; ****** highRate; char input; Rates rates = new Rates(); Console.Write("Do you want default values (enter D) or enter your own (enter O)? "); input = Convert.ToChar(Console.ReadLine()); switch (char.ToUpper(input)) // start switch { case 'D': // if the input latter is d or a D rates.DoRates(); break; case 'O': // if the input latter is o or an O Console.Write("Enter the dollar limit "); incomeLimit = Convert.ToInt32(Console.ReadLine()); Console.Write("Enter the low rate "); lowRate = Convert.********(Console.ReadLine()); Console.Write("Enter the high rate "); highRate = Convert.********(Console.ReadLine()); rates.DoRates(incomeLimit, lowRate, highRate); rates.CalculateTax(income); break; default: Console.WriteLine("You entered and incorrect option"); // display this messages if the input was something other than D or O break; } } public static void Main() { // instantiate an array of five (5) Taxpayer objects. Taxpayer[] taxPayer = new Taxpayer[5]; Rates taxRates = new Rates(); // Implement a for-loop that will prompt the user // to enter the Social Security Number and gross income. for (int x = 0; x < taxPayer.Length; ++x) { taxPayer[x] = new Taxpayer(); Console.Write("Enter Social Security Number for taxpayer {0} ", x + 1); taxPayer[x].socialSecurityNum = Convert.ToString(Console.ReadLine()); Console.Write("Enter gross income for taxpayer {0} ", x + 1); taxPayer[x].grossIncome = Convert.ToInt32(Console.ReadLine()); Taxpayer.GetRates(taxPayer[x].grossIncome); taxPayer[x].taxOwed = taxRates.CalculateTax(taxPayer[x].grossIncome); }

Спасибо за помощь всем. Кажется, я немного увлекся написанием этого кода. После выделения кода с моей проблемой я, наконец, понял это. Вот что я сделал, если кто-то захочет увидеть.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace assignment
{ public class Rates { public int incomeLimit; // income limit public ****** lowTaxRate; // low tax rate public ****** highTaxRate; // high tax rate public int IncomeLimit { get { return incomeLimit; } }// read only property public ****** LowTaxRate { get { return lowTaxRate; } } // read only property public ****** HighTaxRate { get { return highTaxRate; } }// read only property public Rates() { incomeLimit = 30000; lowTaxRate = .15; highTaxRate = .28; } public Rates(int incomeLim, ****** lowRate, ****** highRate) { incomeLimit = incomeLim; lowTaxRate = lowRate; highTaxRate = highRate; } // CalculateTax method that takes an income parameter and computes the tax public int CalculateTax(int income) { int taxOwed = 0; if (income < incomeLimit) { taxOwed = Convert.ToInt32(income * lowTaxRate); } if (income >= incomeLimit) { taxOwed = Convert.ToInt32(income * highTaxRate); } return taxOwed; } } public class Taxpayer { string socialSecurityNum = null; int grossIncome = 0; int taxOwed = 0; // Use get and set accessors. public string SocialSecurityNum { get {return socialSecurityNum;} set {socialSecurityNum = value;} } // Use get and set accessors. public int GrossIncome { get { return grossIncome; } set { grossIncome = value; } } // Use read-only accessor public int TaxOwed { get { return taxOwed; } } public void GetRates(int income) { int incomeLimit = 0; ****** lowRate = 0; ****** highRate = 0; char input; Console.Write("Do you want default values (enter D) or enter your own (enter O)? "); input = Convert.ToChar(Console.ReadLine()); switch (char.ToUpper(input)) // start switch { case 'D': // if the input latter is d or a D Rates rates = new Rates(); taxOwed = rates.CalculateTax(income); break; case 'O': // if the input latter is o or an O Console.Write("Enter the dollar limit "); incomeLimit = Convert.ToInt32(Console.ReadLine()); Console.Write("Enter the low rate "); lowRate = Convert.********(Console.ReadLine()); Console.Write("Enter the high rate "); highRate = Convert.********(Console.ReadLine()); Rates myrates = new Rates(incomeLimit, lowRate, highRate); taxOwed = myrates.CalculateTax(income); break; default: Console.WriteLine("You entered and incorrect option"); // display this messages if the input was something other than D or O break; } } public static void Main() { Taxpayer[] taxPayer = new Taxpayer[5]; Rates taxRates = new Rates(); Taxpayer myTaxpayer = new Taxpayer(); // Implement a for-loop that will prompt the user // to enter the Social Security Number and gross income. for (int x = 0; x < taxPayer.Length; ++x) { taxPayer[x] = new Taxpayer(); Console.Write("Enter Social Security Number for taxpayer {0} ", x + 1); taxPayer[x].socialSecurityNum = Convert.ToString(Console.ReadLine()); Console.Write("Enter gross income for taxpayer {0} ", x + 1); taxPayer[x].grossIncome = Convert.ToInt32(Console.ReadLine()); myTaxpayer.GetRates(taxPayer[x].grossIncome); taxPayer[x].taxOwed = myTaxpayer.taxOwed; } // Implement a for-loop that will display each object // as formatted taxpayer SSN, income and calculated tax. for (int y = 0; y < taxPayer.Length; ++y) { Console.WriteLine("Taxpayer # {0} SSN: {1} income {2:C} Tax is {3:C}", y + 1, taxPayer[y].socialSecurityNum, taxPayer[y].grossIncome, taxPayer[y].taxOwed); } } }
}
2 ответа

Я рекомендую вам изменить свой код, более чистый код и использовать лучшие методы ООП.

Вы должны проверить класс Taxpayer, в частности метод GetRates().

в этом методе вы создаете объект типа "Тарифы", теперь, если вы проверите конструктор класса "Тарифы"

public Rates() { DoRates(); }

он вызывает метод Dorates(), но без параметров, поэтому он всегда будет вызывать метод DoRates

public void DoRates() // class constructor that assigns default values { // set default values for limit, lowRate, and highRate incomeLimit = 30000; lowTaxRate = .15; highTaxRate = .28; }


Я удивлен, что ваш компилятор не жаловался. В Taxpayer.GetRates(int) вы совершаете вызов Rates.CalculateTax(int), который возвращает значение int. Он не хранится и не возвращается нигде, поэтому я не уверен, что цель вызова есть. Кроме того, поскольку rates объекта привязаны к статическому методу GetRates(int), вы не меняете никаких значений в taxrates объектов, которые вы используете для расчета налога. Наконец, как было предложено, ваш конструктор устанавливает значения по умолчанию. Вы могли бы добавить другой конструктор для принятия параметров. Оттуда вы можете захотеть, чтобы вы изменили значения в объекте, который используете, чтобы рассчитать налог.

Бритва Оккама: держите ее просто глупой. Я думаю, вы увлекаетесь ООП. Упростите некоторые вещи, чтобы заставить его работать.

licensed under cc by-sa 3.0 with attribution.