阿宝陪你学C#【类和继承】:面馆里的技艺传承与创新之路
嘿呀!各位编程江湖的小伙伴们!我是你们的老朋友阿宝!前面咱们一起解锁了 C# 类的超多 “高级秘籍”,从成员修饰符到索引器,那可都是干货满满!今天,咱们要踏上一条充满传承与创新的道路 —— 类和继承!这就好比我们面馆里,老师傅把独特的烹饪技艺传给徒弟,徒弟们再在此基础上搞点新花样,让面馆的生意越来越红火!快跟上,听我好好唠一唠!
一、传承的起点:基类的诞生
在我们的编程面馆里,基类就像是面馆的 “老掌柜”,它有着丰富的经验和一套成熟的经营方法。基类定义了一些通用的属性和方法,就像老掌柜掌握着制作面条的基本配方和服务顾客的流程。
比如说,我们创建一个NoodleShop
基类:
class NoodleShop
{
public string ShopName { get; set; }
public int TableCount { get; set; }
public NoodleShop(string shopName, int tableCount)
{
ShopName = shopName;
TableCount = tableCount;
}
public void WelcomeCustomer()
{
Console.WriteLine($"欢迎光临 {ShopName}!本店有 {TableCount} 张桌子,请随意就坐~");
}
public void ServeNoodles()
{
Console.WriteLine("为您上一碗热腾腾的面条,请慢用!");
}
}
在这个NoodleShop
基类里,ShopName
和TableCount
记录着面馆的名字和桌子数量,WelcomeCustomer
方法用来热情招呼顾客,ServeNoodles
方法则负责给顾客端面。这就是基类,它是传承的源头,为后续的发展奠定基础!
二、继承:徒弟们的 “学艺之路”
继承,就像是面馆里的年轻徒弟跟着老掌柜学艺,把老掌柜的本事都学过来!在 C# 里,一个类可以继承另一个类,继承后,子类就拥有了父类(基类)的非私有成员,这就叫 “传承”!
我们创建一个SpecialNoodleShop
子类,让它继承NoodleShop
基类:
class SpecialNoodleShop : NoodleShop
{
public string SpecialDish { get; set; }
public SpecialNoodleShop(string shopName, int tableCount, string specialDish) : base(shopName, tableCount)
{
SpecialDish = specialDish;
}
public void RecommendSpecialDish()
{
Console.WriteLine($"本店特色菜品是 {SpecialDish},强烈推荐您品尝!");
}
}
这里的SpecialNoodleShop
类通过:
符号继承了NoodleShop
类。它不仅拥有了ShopName
、TableCount
属性,以及WelcomeCustomer
、ServeNoodles
方法,还新增了自己的SpecialDish
属性和RecommendSpecialDish
方法。就像徒弟学艺之后,不仅学会了师傅的基础功夫,还开发出了自己的独特招式!
使用继承后的子类也很简单:
SpecialNoodleShop shop = new SpecialNoodleShop("阿宝特色面馆", 15, "神龙大侠牛肉面");
shop.WelcomeCustomer();
shop.RecommendSpecialDish();
运行代码,你会看到,子类轻松调用了从父类继承来的WelcomeCustomer
方法,也能使用自己特有的RecommendSpecialDish
方法,这就是继承的神奇之处!
三、重写:徒弟的 “创新改良”
徒弟们学艺之后,总想着搞点新花样,对师傅教的招式进行改良,这在 C# 里就叫重写!当父类的方法不能满足子类的特殊需求时,子类可以重写父类的方法,按照自己的方式来实现。
在NoodleShop
基类里,我们把ServeNoodles
方法改成虚方法,为子类重写做准备:
class NoodleShop
{
// 其他成员省略...
public virtual void ServeNoodles()
{
Console.WriteLine("为您上一碗热腾腾的面条,请慢用!");
}
}
virtual
关键字表示这个方法可以被子类重写。然后在SpecialNoodleShop
子类中重写这个方法:
class SpecialNoodleShop : NoodleShop
{
// 其他成员省略...
public override void ServeNoodles()
{
Console.WriteLine($"为您精心呈上特色 {SpecialDish},祝您用餐愉快!");
}
}
override
关键字表明这是对子类中虚方法的重写。当我们调用子类的ServeNoodles
方法时:
SpecialNoodleShop shop = new SpecialNoodleShop("阿宝特色面馆", 15, "神龙大侠牛肉面");
shop.ServeNoodles();
输出的就是子类重写后的内容!重写让子类在继承的基础上,实现了个性化的创新,就像徒弟把师傅的招式改良得更厉害!
四、抽象类:神秘的 “武林秘籍总纲”
抽象类就像是一本神秘的 “武林秘籍总纲”,它只给出一些抽象的概念和方法,具体的实现要靠后面的子类来完成。抽象类不能直接创建对象,必须有子类继承它并实现抽象方法才行。
我们定义一个抽象的FamousNoodleShop
类:
abstract class FamousNoodleShop
{
public abstract void MakeFamousNoodles();
public void IntroduceShop()
{
Console.WriteLine("这是一家著名的面馆,有着独特的面条制作工艺!");
}
}
abstract
关键字表示这是一个抽象类,MakeFamousNoodles
是抽象方法,它只有声明,没有具体实现。然后创建一个子类LegendaryNoodleShop
来继承并实现抽象方法:
class LegendaryNoodleShop : FamousNoodleShop
{
public override void MakeFamousNoodles()
{
Console.WriteLine("使用独家秘方,制作出绝世美味的面条!");
}
}
通过继承和重写,子类让抽象类的抽象方法有了实际意义。抽象类就像给子类指明了方向,让它们在统一的框架下进行创作!
五、接口:跨门派的 “技艺交流大会”
接口和继承不太一样,它更像是一场跨门派的 “技艺交流大会”,规定了一系列的 “标准动作”,只要符合这些标准,不管你是哪个门派(类)都能参加!
我们定义一个ICleanable
接口,规定类必须具备 “打扫卫生” 的能力:
interface ICleanable
{
void CleanShop();
}
然后让NoodleShop
类实现这个接口:
class NoodleShop : ICleanable
{
// 其他成员省略...
public void CleanShop()
{
Console.WriteLine("认真打扫面馆,让环境焕然一新!");
}
}
一个类可以实现多个接口,这就好比一个人可以同时掌握多种门派的功夫,大大增强了类的功能和灵活性!
六、总结:在传承与创新中成长
到这里,C# 里类和继承的知识就讲完啦!从基类的传承,到子类的创新重写,再到抽象类和接口的神奇作用,每一个知识点都像是面馆发展过程中的关键环节!掌握了这些,你在编程江湖里就拥有了强大的 “传承与创新” 之力!
下次遇到复杂的编程问题,不妨试试用继承和接口的思路,让代码在传承中优化,在创新中升级!要是还有啥不懂的,别犹豫,来我的面馆,咱们边吃面条边探讨,保准让你豁然开朗!