综合练习:宠物店管理系统
这是什么:青蛙宠物店——用面向对象方式搭出来的小项目,管着一批宠物的上架与总价。
为什么用:前面的类、属性、继承多态、接口都是单招,这一场把它们连成一招,看它们合起来能不能撑起一个像样的项目。
如何用:本章先定下 ISellable 接口和 Pet 基类,再拼出 Dog、Cat 子类和 PetShop 管家的完整代码。
项目目标
ISellable接口:凡是能上架卖的东西,都得会"自报家门"Pet基类:所有宠物的公共部分(名字、价格)Dog/Cat子类:继承Pet,各自 override 出特色介绍PetShop类:用List<Pet>管理在售宠物,能列名单、算总货值
完整代码
新建项目(dotnet new console -o PetShop),把 Program.cs 整个换成:
// ===== 程序从这里开始跑 =====
PetShop shop = new PetShop();
shop.Add(new Dog("旺财", 1200, "柴犬"));
shop.Add(new Cat("咪咪", 800));
shop.Add(new Dog("大黄", 600, "中华田园犬"));
shop.ShowAll();
Console.WriteLine($"店里总货值:{shop.TotalValue()} 元");
// ===== 下面是各类的定义 =====
// 接口:能上架的东西都要会自报家门
interface ISellable
{
string Name { get; }
int Price { get; }
string Describe();
}
// 基类:所有宠物的公共部分
class Pet : ISellable
{
public string Name { get; set; }
public int Price { get; set; }
public Pet(string name, int price)
{
Name = name;
Price = price;
}
public virtual string Describe()
{
return $"{Name},标价 {Price} 元";
}
}
// 子类:狗——继承公共部分,再加自己的特色
class Dog : Pet
{
public string Breed { get; set; }
public Dog(string name, int price, string breed)
: base(name, price)
{
Breed = breed;
}
public override string Describe()
{
return base.Describe() + $",品种:{Breed},会握手";
}
}
class Cat : Pet
{
public Cat(string name, int price) : base(name, price) { }
public override string Describe()
{
return base.Describe() + ",会自己用猫砂";
}
}
// 商店:用 List 管理所有宠物
class PetShop
{
private List<Pet> pets = new List<Pet>();
public void Add(Pet pet) => pets.Add(pet);
public void ShowAll()
{
Console.WriteLine("==== 青蛙宠物店在售名单 ====");
foreach (Pet pet in pets)
{
Console.WriteLine(pet.Describe());
}
}
public int TotalValue()
{
int total = 0;
foreach (Pet pet in pets)
{
total += pet.Price;
}
return total;
}
}
dotnet run 跑起来:
==== 青蛙宠物店在售名单 ====
旺财,标价 1200 元,品种:柴犬,会握手
咪咪,标价 800 元,会自己用猫砂
大黄,标价 600 元,品种:中华田园犬,会握手
店里总货值:2600 元
这段代码用上了哪些招
| 招式 | 用在哪 |
|---|---|
| 接口 | ISellable 约束一切可卖之物 |
| 继承 | Dog : Pet、Cat : Pet,公共代码只写一遍 |
| virtual / override | Pet.Describe 开口,子类各自接管 |
| base | base.Describe() 先说公共部分,再补特色 |
| 属性 | Name、Price 全部用属性暴露 |
List<T> |
PetShop 用列表管理任意多只宠物 |
| 表达式体 | Add、构造函数一行搞定 |
这就是面向对象写"大程序"的套路:接口定合同、基类管公共、子类管特色、容器管集合——每个类只干一件事,组合起来就是完整系统。
记忆口诀
接口定合同,基类管公共;子类补特色,List 装千宠。
动手改
- 加一个
Bird : Pet子类,介绍里带"会唱歌",加进店里跑一遍 - 给
PetShop加Sell(string name)方法:按名字卖掉一只宠物,从名单移除并打印成交价 - 统计标价超过 1000 元的宠物有几只,输出"高档宠物 X 只"
面向对象毕业 🎉 下一站 Unity 入门,用 C# 写游戏!