C# 实现简单超市收银系统:继承与多态实战
本文通过一个完整的 C# 控制台示例,演示如何构建简单的超市收银系统。核心逻辑包括建立商品抽象基类、使用分层列表模拟仓库货架,以及应用多态机制灵活结算折扣。该案例适合初学者理解面向对象的封装、继承与多态特性。
需求分析与架构设计
一个简单的超市收银系统通常包含三个核心场景:商品的基础信息管理、仓库的进货出货调度、以及收银台的金额结算(含折扣)。为了实现代码的可扩展性,我们采用面向对象的设计思路:
- 商品层:提取公有属性(名称、价格、数量)作为抽象基类。
- 仓储层:使用
List<List<ProduckFather>>结构存储不同类别的商品,便于分类查找与管理。 - 结算层:定义折扣接口(抽象类),支持八折、满减等不同促销策略的动态切换。
下图展示了系统整体功能模块的逻辑关系:
第一步:定义商品抽象基类
为了统一管理所有商品,首先创建抽象父类 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# 控制台应用开发的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













