Я сделал это но он не делает то что мне нужно Может кто нибудь помочь
Создайте класс PatientDemo, который выполняет следующие действия:
Создайте класс пациентов для отдела выставления счетов больницы Райтстаун. Включите следующие свойства и поля get и set: идентификационный номер пациента, имя, возраст и сумма, причитающаяся больнице.
Добавьте конструктор для класса пациента, который принимает идентификатор, имя, возраст и причитающуюся сумму.
Переопределите метод ToString (), чтобы вернуть все сведения о пациенте, распечатанные в формате записи.
С помощью класса пациента в качестве базового класса, производный класс InsuredPatient. InsuredPatient содержит все данные пациента, а также поля для хранения названия страховой компании и процентов от больничного счета, который страховая компания будет оплачивать.
Вам также понадобится конструктор для этого класса.
Вам нужно будет получить и установить эти значения в классе InsuredPatient. Страховые выплаты основаны на следующей таблице:
Страховая компания часть счета оплачивается страховой компанией
Райтстаун Взаимный 80%
Красный Зонтик 60%
Все остальные компании 25%
Переопределите метод родительского класса ToString (), чтобы включить в него название страховой компании, уплаченный процент и сумму, причитающуюся после применения страховки к счету. Когда я запускаю проект, я получаю все, кроме % от страховки. Может ли кто-нибудь сказать мне, что я делаю не так?
Что я уже пробовал:
using System; public class PatientDemo { public static void Main() { InsuredPatient[] patient = new InsuredPatient[5]; int x, y; double grandAmountDue = 0; bool goodNum; for (x = 0; x < patient.Length; ++x) { patient[x] = new InsuredPatient(); Console.Write("Enter patient number "); patient[x].PatientNumber = Convert.ToInt32(Console.ReadLine()); goodNum = true; for (y = 0; y < x; ++y) { if (patient[x].Equals(patient[y])) goodNum = false; } while (!goodNum) { Console.Write("Sorry, the patient number " + patient[x].PatientNumber + " is a duplicate. " + "\nPlease reenter "); patient[x].PatientNumber = Convert.ToInt32(Console.ReadLine()); goodNum = true; for (y = 0; y < x; ++y) { if (patient[x].Equals(patient[y])) goodNum = false; } } Console.Write("Enter name "); patient[x].Name = Console.ReadLine(); Console.Write("Enter age "); patient[x].Age = Convert.ToInt32(Console.ReadLine()); Console.Write("Enter insurance company "); patient[x].InsCompany = Console.ReadLine(); Console.Write("Enter amount due "); patient[x].AmountDue = Convert.ToDouble(Console.ReadLine()); } Console.WriteLine("\nSummary:\n"); Array.Sort(patient); for (x = 0; x < patient.Length; ++x) { Console.WriteLine(patient[x].ToString()); grandAmountDue += patient[x].AmountDue; } Console.WriteLine("\nAmountDue for all patients is " + grandAmountDue.ToString("C")); } } class Patient { public Patient(int num, string name, int age, int amt) { PatientNumber = num; Name = name; Age = age; AmountDue = amt; } public Patient() : this(9, "ZZZ", 0, 0) { } public int PatientNumber { get; set; } public string Name { get; set; } public int Age { get; set; } public double AmountDue { get; set; } public override string ToString() { return (GetType() + " " + PatientNumber + " " + Name + " " + Age + " AmountDue is " + AmountDue.ToString("C")); } public override bool Equals(Object e) { bool equal; Patient temp = (Patient)e; if (PatientNumber == temp.PatientNumber) equal = true; else equal = false; return equal; } public override int GetHashCode() { return PatientNumber; } } class InsuredPatient : Patient, IComparable { public const string INSCO1 = "Wrightstown Mutual"; public const string INSCO2 = "Red Umbrella"; public const double PCT1 = 0.80; public const double PCT2 = 0.60; public const double PCT3 = 0.25; string insCompany; double pctPaid; double origAmountDue; public InsuredPatient(int num, string name, int age, int amt, string co, double pct) : base(num, name, age, amt) { InsCompany = co; OrigAmountDue = AmountDue; AmountDue = OrigAmountDue - (pctPaid * OrigAmountDue); } public InsuredPatient() : this(0, "", 0, 0, "", 0) { } public string InsCompany { get { return insCompany; } set { insCompany = value; if (insCompany == INSCO1) PctPaid = PCT1; else if (insCompany == INSCO2) PctPaid = PCT2; else PctPaid = PCT3; } } public double OrigAmountDue { get { return origAmountDue; } set { origAmountDue = value; } } public double PctPaid { get { return pctPaid; } set { pctPaid = value; } } public new double AmountDue { get { return base.AmountDue; } set { origAmountDue = value; base.AmountDue = origAmountDue - (pctPaid * origAmountDue); } } public override string ToString() { string temp = base.ToString(); temp = temp + "\n Original total is " + origAmountDue.ToString("C") + "\n " + insCompany + " Insurance Company pays " + pctPaid.ToString("P") + "\n So patient owes......................... " + AmountDue.ToString("C"); return temp; } int IComparable.CompareTo(Object o) { int returnVal; InsuredPatient temp = (InsuredPatient)o; if (this.PatientNumber > temp.PatientNumber) returnVal = 1; else if (this.PatientNumber < temp.PatientNumber) returnVal = -1; else returnVal = 0; return returnVal; } }
Patrice T
Опишите, как он не делает того, что должен.
Eric Lynch
Ну же! У вас есть имя "ppolymorphe", и вы не поймали ключевое слово "new" на InsuredPatient.Свойство AmountDue и предложить изменить его на "виртуальный/переопределенный"? Такая упущенная возможность :)
Patrice T
Я даже не пытался читать код :)
Eric Lynch
Я поддерживаю точку зрения пполиморфа. Хотя кажется, что у вас есть какая-то проблема, связанная с PctPaid, неясно точно, что это может быть за проблема. Например, влияет ли он на всех пациентов или только на одного? Каковы были ваши ожидаемые значения? Каковы были ваши действительные ценности? Если вы хотите получать помощь своевременно, то чем больше информации вы включите, тем лучше будут ваши результаты. В отличие от вас, мы не можем видеть ваш экран или пройти через отладчик, чтобы посмотреть на вещи. Мы можем работать только с той информацией, которую Вы нам предоставляете.
Тем не менее, хотя это и не поможет вам решить вашу проблему, я хотел бы предложить несколько улучшений в вашем коде.
Вы повторяете следующее несколько раз в своем коде:
goodNum = истина;
для (y = 0; y < x; ++y)
если (пациент[x].равно(пациент[y]))
goodNum = ложь;
Вы можете рассмотреть возможность переноса этого в метод IsPatientValid, который можно вызвать в обоих местах. Кроме того, вы просите пациента, а затем петля, чтобы попросить действительного пациента. Если вы немного рефакторируете, вы можете уменьшить это дублирование до одного цикла, который получает действительного пациента.
Кроме того, похоже, что вы знакомы с автоматически реализуемыми свойствами. Возможно, вы захотите использовать их более последовательно. Например, следующее:
двойной pctPaid;
публичный двойной PctPaid
{
получить
{
возврат pctPaid;
}
набор
{
pctPaid = значение;
}
}
Может быть:
public double PctPaid { get; set; }
Это действительно немного очищает код. У вас есть несколько мест, которые выиграют от этого.
Кроме того, об этом:
общественности новый двойной AmountDue
Только не надо! Почти нет случаев, когда уместно скрывать унаследованный член с помощью ключевого слова "new". Это не один из них.
Добавить "виртуальный" ключевое слово, чтобы AmountDue в больного, ключевое слово "override" в AmountDue в InsuredPatient. Это может показаться незначительной разницей. Доверьтесь мне. Это не.
В конце концов, в какой-то будущей программе это "новое" ключевое слово вызовет у вас некоторые серьезные головные боли. Используя ключевое слово "new", если вы когда-либо назначите значение InsuredPatient переменной Patient, вы не получите ожидаемую сумму. Вы получите его от пациента...а не от застрахованного пациента. Ключевое слово "new" просто скрывает значение в родительском классе, но оно все еще там, ожидая, чтобы вызвать у вас проблемы.
Его заменяет пара ключевых слов "virtual/override". Вместе они обеспечивают одно из многих чудес, которое является полиморфизмом :)