using System.Collections.Generic;
public string Name { get; set; }
public decimal Price { get; set; }
public Product Product { get; set; }
public int Quantity { get; set; }
public abstract class Discount
public abstract decimal Apply(decimal subtotal);
public class Percentage : Discount {
private decimal percentage;
public Percentage(decimal percentage) {
this.percentage = percentage;
public override decimal Apply(decimal subtotal) {
return subtotal * (100M - percentage)/100M;
public class Fixed : Discount {
public Fixed(decimal amount) {
public override decimal Apply(decimal subtotal) {
return amount - subtotal;
public record Order(List<OrderLine> OrderLines, Discount Discount)
public decimal CalculateTotalPrice()
decimal subtotal = OrderLines.Sum(ol => ol.Product.Price * ol.Quantity);
return Discount?.Apply(subtotal) ?? subtotal;