C# 实现简单超市收银系统:继承与多态实战

洛溪
洛溪
发布时间:2026-10-16 | 4人浏览过
原创

本文通过一个完整的 C# 控制台示例,演示如何构建简单的超市收银系统。核心逻辑包括建立商品抽象基类、使用分层列表模拟仓库货架,以及应用多态机制灵活结算折扣。该案例适合初学者理解面向对象的封装、继承与多态特性。

需求分析与架构设计

一个简单的超市收银系统通常包含三个核心场景:商品的基础信息管理、仓库的进货出货调度、以及收银台的金额结算(含折扣)。为了实现代码的可扩展性,我们采用面向对象的设计思路:

  1. 商品层:提取公有属性(名称、价格、数量)作为抽象基类。
  2. 仓储层:使用 List<List<ProduckFather>> 结构存储不同类别的商品,便于分类查找与管理。
  3. 结算层:定义折扣接口(抽象类),支持八折、满减等不同促销策略的动态切换。

下图展示了系统整体功能模块的逻辑关系:

第一步:定义商品抽象基类

为了统一管理所有商品,首先创建抽象父类 ProduckFather。该类定义了每个商品必须具备的核心字段,并为子类提供了初始化入口。

abstract class ProduckFather
{
    private string _name;
    private double _price;
    private int _count;
    private string _id;

    public string Name { get => _name; set => _name = value; }
    public double Price { get => _price; set => _price = value; }
    public int Count { get => _count; set => _count = value; }
    public string Id { get => _id; set => _id = value; }

    public ProduckFather(string name, double price, int count)
    {
        this.Name = name;
        this.Price = price;
        this.Count = count;
    }
}

随后,可以基于此基类派生具体商品。以苹果为例:

class Apple : ProduckFather
{
    public Apple(string name, double price, int count) : base(name, price, count)
    {
        // 可在子类中添加特有属性
    }
}

第二步:实现仓库库存管理

仓库是存储商品的核心容器。为了方便按品类管理,这里使用一个二维列表结构:List<List<ProduckFather>>。外层列表代表不同的“货架”(品类),内层列表代表该货架上的具体商品。

第 1 步:初始化仓库结构

构造函数中预先为每种商品(如苹果、香蕉、Vivo手机等)分配独立的子列表,确保调用时容器已就绪。

public Cangku()
{
    // 分别添加对应品类的货架
    list.Add(new List<ProduckFather>());
    list.Add(new List<ProduckFather>());
    // ... 其他货架初始化
}

第 2 步:实现进货与出货逻辑

进货 (GetPros):根据传入的货物类型字符串,将新对象添加到对应的列表中。

出货 (SetPros):验证库存数量是否满足请求。若满足,则从列表头部移除商品并返回;若不足,则提示错误。注意此处涉及数组索引的正确遍历处理。

public ProduckFather[] SetPros(string strType, int count)
{
    ProduckFather[] pros = new ProduckFather[count];
    for (int i = 0; i < count; i++)
    {
        switch (strType)
        {
            case "Apple":
                if (list[0].Count > count - i) // 动态检查剩余库存
                {
                    pros[i] = list[0][0];
                    list[0].RemoveAt(0);
                }
                else 
                {
                    Console.WriteLine("Apple货物不足!");
                    break;
                }
                break;
            // 其他类型类似处理...
            default: Console.WriteLine("输入错误"); break;
        }
    }
    return pros;
}

展示功能 (ShowPros):遍历列表输出当前各品类的库存状态。

第三步:设计折扣策略模式

为了支持未来灵活的促销活动(如打八折、满300减50等),使用抽象类 CalFather 定义计算契约,并通过派生类实现具体的算法。

// 策略基类
abstract class CalFather
{
    public abstract double Cal(double realmoney);
}

// 折扣策略:例如 8 折
class CalRate : CalFather
{
    private double _rate;
    public double Rate { get => _rate; set => _rate = value; }

    public CalRate(double rate)
    {
        this.Rate = rate;
    }

    public override double Cal(double realmoney)
    {
        return realmoney * this.Rate;
    }
}

// 满减策略:例如 满300减50
class CalMN : CalFather
{
    private double m;
    private double n;

    public CalMN(double m, double n)
    {
        this.M = m;
        this.N = n;
    }

    public override double Cal(double realmoney)
    {
        // 计算公式:总价 - (N * (总价 / M 向下取整))
        return realmoney - N * (realmoney / M); 
    }
}

第四步:构建用户交互界面

主类 SuperMarket 负责协调仓库与收银逻辑,并提供命令行交互。

第 1 步:初始化超市环境

在超市类实例化时,自动触发仓库的基础进货操作,保证系统启动即可用。

public SuperMarket()
{
    ck.GetPros("Apple", 100);
    ck.GetPros("Banana", 1000);
    ck.GetPros("Vivo", 150);
    // ... 其他初始化
}

第 2 步:执行购买流程 (SayWhat)

这是交互的核心循环: 1. 获取用户购买的种类和数量。 2. 从仓库提取商品并计算原价。
3. 引导用户选择优惠方式(8折/满减/无优惠)。

public void SayWhat()
{
    Console.Write("请输入购买物品名及数量:");
    // ... 省略部分读取逻辑 ...
    string str = Console.ReadLine();
    int count = Convert.ToInt32(Console.ReadLine());
    
    // 获取商品并计算原价
    ProduckFather[] pros = ck.SetPros(str, count);
    double money = GetMoney(pros);

    // 选择优惠策略
    Console.WriteLine("请选择打折方式: 1--8折, 2--满300送50, 3--不打折");
    int input = Input(); 
    CalFather cal = Money(input); // 返回具体的策略对象
    
    // 最终结算
    double finalPrice = cal.Cal(money);
    XiaoPiao(pros, finalPrice);
}

运行效果与总结

经过上述步骤,系统能够接受命令行输入,实时扣减库存,并根据策略计算出最终价格打印伪小票。下图展示了程序的实际运行结果:

本代码展示了 C# 控制台开发的基本结构。在实际生产环境中,还需要增加以下优化: 1. 引入异常捕获(Try-Catch)以增强稳定性。
2. 完善数据持久化,防止重启后库存丢失。
3. 优化界面显示格式,使其更符合商业收银规范。

以上就是 C# 实现简单超市收银系统的详细内容,更多关于 C# 控制台应用开发的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表