🐸 青蛙编程网
首页 / C# / 面向对象 / 5. 综合练习

综合练习:宠物店管理系统

这是什么:青蛙宠物店——用面向对象方式搭出来的小项目,管着一批宠物的上架与总价。

为什么用:前面的类、属性、继承多态、接口都是单招,这一场把它们连成一招,看它们合起来能不能撑起一个像样的项目。

如何用:本章先定下 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 装千宠。

动手改

  1. 加一个 Bird : Pet 子类,介绍里带"会唱歌",加进店里跑一遍
  2. 给 PetShop 加 Sell(string name) 方法:按名字卖掉一只宠物,从名单移除并打印成交价
  3. 统计标价超过 1000 元的宠物有几只,输出"高档宠物 X 只"

面向对象毕业 🎉 下一站 Unity 入门,用 C# 写游戏!

📥 下载本章代码

ZIP 内含本章全部代码文件与说明,解压即用,与教程内容同步生成。