Листинг класса MeatProducts
Класс MeatProducts является наследником класса Product и содержит в себе свойство, связанное только с мясной продукцией поэтому использование наследования в данном случае уместно, также класс имеет свою реализацию абстрактного метода родительского класса и конструктор для инициализации свойств.
public class MeatProducts : Product
{
public bool Butchered { get; set; }
public override bool CheckDiscount()
{
TimeSpan now = DateTime.Now.TimeOfDay;
TimeSpan from = new TimeSpan(9, 14, 0);
TimeSpan to = new TimeSpan(21, 0, 0);
if (now > from && now < to && PricePerUnit > 250 && DiscountPercentage != 0)
{
Console.WriteLine(String.Format("С {0}:00 до {1}:00 скидка на {2} - {3}%", from.Hours, to.Hours, Name, DiscountPercentage));
return true;
}
else
{
return false;
}
}
public MeatProducts(string name, string measureUnit, decimal pricePerUnit, float needQuantity,
bool butchered, float discountPercentage = 0) : base(name, measureUnit, pricePerUnit, needQuantity, discountPercentage)
{
this.Butchered = butchered;
}
}
Листинг класса VegetablesAndFruits
Класс VegetablesAndFruits является наследником класса Product и содержит в себе свойство, связанное только с овощами и фруктами поэтому использование наследования в данном случае уместно, также класс имеет свою реализацию абстрактного метода родительского класса и конструктор для инициализации свойств.
public class VegetablesAndFruits : Product
{
public bool IsWeighted { get; set; }
public int WeightCode { get; set; }
public override bool CheckDiscount()
{
if (DateTime.Now.Month == 6 && DiscountPercentage != 0)
{
Console.WriteLine(String.Format("В этом месяце скидка на {0} - {1}%", Name, DiscountPercentage));
return true;
}
else
{
return false;
}
}
public VegetablesAndFruits(string name, string measureUnit, decimal pricePerUnit, float needQuantity,
int weightCode, float discountPercentage = 0) : base(name, measureUnit, pricePerUnit, needQuantity, discountPercentage)
{
this.WeightCode = weightCode;
this.IsWeighted = false;
}
}
Листинг класса Customer
Класс Customer содержит в себе: свойства для хранения информации о покупателе; перегруженный метод добавления товара в список покупок, который в зависимости от типа переданного объекта будет либо записывать в список дополнительную информацию о товаре либо нет; методы для взвешивания товара, добавления товара в корзину и выкладывания товара из корзины; метод для подсчета стоимости всех товаров в корзине; метод для оплаты покупки любым из трех способов, который предусматривает случай, когда у покупателя в корзине есть не взвешенные товары и случай, когда у покупателя не хватает средств для оплаты покупки; конструктор для инициализации свойств.
public class Customer
{
public string Name { get; set; }
private decimal moneyBalance;
public decimal MoneyBalance
{
get
{
return moneyBalance;
}
set
{
if (value > 0)
moneyBalance = value;
}
}
private decimal bonusBalance;
public decimal BonusBalance
{
get
{
return bonusBalance;
}
set
{
if (value > 0)
bonusBalance = value;
}
}
//Перегруженный метод добавления товара в список покупок
public void AddToList(List<string> list, Product product)
{
string str = String.Format("{0} {1} {2}.", product.Name, product.NeedQuantity, product.MeasureUnit);
list.Add(str);
}
public void AddToList(List<string> list, MilkProducts product)
{
string str = String.Format("{0} {1} {2} (жирность: {3}%).", product.Name, product.NeedQuantity,
product.MeasureUnit, product.FatPercentage);
list.Add(str);
}
public void AddToList(List<string> list, MeatProducts product)
{
string str;
if (product.Butchered)
{
str = String.Format("{0} {1} {2} (разделанное).", product.Name, product.NeedQuantity, product.MeasureUnit);
} else
{
str = String.Format("{0} {1} {2} (неразделанное).", product.Name, product.NeedQuantity, product.MeasureUnit);
}
list.Add(str);
}
//Взвешивание продукта
public void WeighProduct(VegetablesAndFruits product)
{
product.IsWeighted = true;
Console.WriteLine(String.Format("\nВзвешен товар {0} с кодом {1}. Вес: {2} кг",
product.Name, product.WeightCode, product.NeedQuantity));
}
//Добавление в корзину
public void AddToCart(List<Product> cart, Product product)
{
cart.Add(product);
Console.WriteLine("Товар " + product.Name + " добавлен в корзину.");
}
//Выкладывание из корзины
public void PutOutOfCart(List<Product> cart)
{
Console.WriteLine("\nНе хватает средств на оплату продуктов. Вы можете выложить некоторые товары.");
int productNum;
while (true)
{
Console.WriteLine("Введите номер товара, который хотите выложить.");
for (int i = 0; i < cart.Count; i++)
{
Console.WriteLine(i + " - " + cart[i].Name);
}
string input = Console.ReadLine();
bool check = int.TryParse(input, out productNum);
if (productNum < 0 || productNum > cart.Count - 1 || !check)
{
Console.WriteLine("\nТакого товара нет в списке!");
}
else
{
break;
}
}
Console.WriteLine("Товар " + cart[productNum].Name + " выложен из корзины.");
cart.RemoveAt(productNum);
}
//Вычисление стоимости всех товаров
public decimal CalcSumOfProducts(List<Product> cart, Customer customer)
{
decimal sum = 0;
Console.WriteLine();
for (int i = 0; i < cart.Count; i++)
{
if (cart[i].GetType().Name == "VegetablesAndFruits")
{
VegetablesAndFruits product = (VegetablesAndFruits)cart[i];
if (!product.IsWeighted)
{
Console.WriteLine("Товар " + cart[i].Name + " невзвешен. Взвесьте товар.");
customer.WeighProduct(product);
}
}
decimal cost;
decimal discountedCost;
cost = cart[i].PricePerUnit * Convert.ToDecimal(cart[i].NeedQuantity);
if (cart[i].CheckDiscount())
{
discountedCost = cart[i].PricePerUnit * Convert.ToDecimal(cart[i].NeedQuantity * (1 - cart[i].DiscountPercentage / 100));
Console.WriteLine(String.Format("Товар для оплаты: {0}; количество: {1} {2}; стоимость: {3} р (без скидки: {4} р).",
cart[i].Name, cart[i].NeedQuantity, cart[i].MeasureUnit, discountedCost, cost));
}
else
{
Console.WriteLine(String.Format("Товар для оплаты: {0}; количество: {1} {2}; стоимость: {3} р",
cart[i].Name, cart[i].NeedQuantity, cart[i].MeasureUnit, cost));
}
sum += cost;
}
Console.WriteLine("\nОбщая сумма покупок: " + sum + " р");
Console.WriteLine("Наличные: " + customer.MoneyBalance + " р");
Console.WriteLine("Бонусы: " + customer.BonusBalance + " р");
return sum;
}
//Оплата покупки
public void Pay(List<Product> cart, Customer customer)
{
decimal sum = CalcSumOfProducts(cart, customer);
//Если покупателю не хватает денег на оплату
if (customer.MoneyBalance + customer.BonusBalance < sum)
{
//Выкладывание товаров из корзины пока не будет хватать средств на оплату
while (true)
{
if (customer.MoneyBalance + customer.BonusBalance >= sum)
{
break;
}
customer.PutOutOfCart(cart);
sum = CalcSumOfProducts(cart, customer);
}
if (cart.Count == 0)
{
Console.WriteLine("\nТоваров не осталось в корзине. \n" + customer.Name + " вышел из магазина.");
//Выход из консоли с кодом 0
Environment.Exit(0);
}
}
while (true)
{
Console.WriteLine("Введите способ оплаты. 0 - наличными, 1 - бонусами, 2 - бонусами и наличными.");
string input = Console.ReadLine();
bool check = int.TryParse(input, out int paymentMethod);
//Проверка на введенное значение
if (paymentMethod < 0 || paymentMethod > 2 || !check)
{
Console.WriteLine("\nСпособ олаты введен не корректно!");
}
//Только наличными
else if (paymentMethod == 0 && customer.MoneyBalance >= sum)
{
customer.MoneyBalance -= sum;
Console.WriteLine("\nПокупки успешно оплачены. Метод оплаты: наличными.");
//Выход из цикла while
return;
}
//Только бонусами
else if (paymentMethod == 1 && customer.BonusBalance >= sum)
{
customer.BonusBalance -= sum;
Console.WriteLine("\nПокупки успешно оплачены. Метод оплаты: бонусами.");
//Выход из цикла while
return;
}
//Бонусами и наличными
else if (paymentMethod == 2 && customer.MoneyBalance + customer.BonusBalance >= sum)
{
while (true)
{
Console.WriteLine("Введите количество бонусов для списывания.");
string bonusInput = Console.ReadLine();
bool bonusCheck = decimal.TryParse(bonusInput, out decimal bonus);
//Проверка на корректность введененного количества бонусов
if (bonus < 0 || bonus > customer.BonusBalance || !bonusCheck
|| bonus < sum - customer.MoneyBalance)
{
Console.WriteLine("\nВведено не корректное число бонусов.");
}
else
{
sum -= bonus;
customer.BonusBalance -= bonus;
customer.MoneyBalance -= sum;
Console.WriteLine("\nПокупки успешно оплачены. Метод оплаты: бонусами и наличными.");
//Выход из цикла while
return;
}
}
}
//Не хватает средств для оплаты "только наличными" или "только бонусами"
else
{
Console.WriteLine("\nНедостаточно средств, выберите другой способ оплаты.");
}
}
}
public Customer(string name, decimal moneyBalnce, decimal bonusBalance)
{
this.Name = name;
this.MoneyBalance = moneyBalnce;
this.BonusBalance = bonusBalance;
}
}
Вывод
В ходе работы была написана программа, которая демонстрирует покупку товаров в магазине. При написании программы были использованы такие базовые принципы ООП как наследование, полиморфизм, абстракция и инкапсуляция.