C#基础巩固(1)-多态+简单工厂
多态
如果要简要的描述多态的话,我个人是这样理解的:通过继承,父类定义方法,具休的实现由子类进行。
01代码
//父类 class Person { public virtual void skill() //vitrual -虚方法,方法可被重写 { Console.WriteLine("人会走路"); } } class Xiaoming:Person { public override void skill() //重写父类方法 { Console.WriteLine("小明会唱歌"); } } class XiaoHu : Person { public override void skill() { Console.WriteLine("小虎会游泳"); } } class Program { static void Main(string[] args) { Person p1 = new Xiaoming();//里氏转换原则 可以将子类赋值给父类 Person p2 = new XiaoHu(); p1.skill(); p2.skill(); Console.ReadKey(); } }
输出:
通过这个例子 Person 类定义了skill方法,方法的具体实现由子类进行。
02如果不重写的话
即 如果子类的 override 改为new 那么父类和子类的方法是独立的,此时执行下面的代码
//父类 class Person { public virtual void skill() { Console.WriteLine("人会走路"); } } class Xiaoming:Person { public new void skill() //重写父类方法 { Console.WriteLine("小明会唱歌"); } } class Program { static void Main(string[] args) { Person p1 = new Xiaoming();//里氏转原则 Xiaoming p2 = new Xiaoming(); p1.skill(); p2.skill(); Console.ReadKey(); } }
输出:
可以看出,p.skill();这里看.前面的对象,是什么类型的,就执行那个类里里面的 skill()方法,这里P1是Person类的,P2是Xiaoming类的。
多态+简单工厂
如果我想通过输入 小明,小虎。 这时候系统自动给显示小明会什么,小虎会什么出来。
那么首先增加一个工厂类
生活中工厂是用来加工的产品的,同样这里也是根据传入的参数,加工后返回对应的结果
全部代码
//父类 class Person { public virtual void skill() { Console.WriteLine("人会走路"); } } class Xiaoming:Person //继承Person { public override void skill() //重写父类方法 { Console.WriteLine("小明会唱歌"); } } class XiaoHu : Person { public override void skill() { Console.WriteLine("小虎会游泳"); } } //工厂类 --新增 class Factory { public static Person instance(string Name) { switch (Name) { case "1": return new Xiaoming(); case "2":return new XiaoHu(); default: return null; } } } class Program { static void Main(string[] args) { Console.WriteLine("请输入序号查看技能,输入1、2...."); Console.WriteLine("1.小明"); Console.WriteLine("2.小虎"); Console.WriteLine("输入:"); string res = Console.ReadLine(); Console.WriteLine("结果:"); Person p = Factory.instance(res); if (p != null) { p.skill(); } else { Console.WriteLine("没找到这个人"); } Console.ReadKey(); } }
执行结果:
此时,多态+简单工厂就已经实现了。
拓展1:抽象(abstract)实现多态
1. 前面的 virtual(虚方) 实现多态已经完成了,其实 抽象(abstract)实现多态也是大同小异
2. abstract 和virtual的区别在于abstract 没有方法体,方法都可以被重写。
实现:把上面完整的代码 的父类改成 下面就完成了,功能一样。
1 2 3 4 5 6 | //父类 abstract class Person { public abstract void skill();//方法没有方法体 } |
拓展2:接口(interface)实现多态
1.这里就不是继承了,是实现接口的方法。
2.接口的方法和抽象一样没有方法体。
实现:把上面完整的代码的父类改成接口
//接口 interface Person { void skill(); }
然后把原来子类的 override 去掉 ,因为接口(interface)是不能被重写(override)的。虚方法(virtual),抽象(abstract)才能被重写
OK,接口实现多态也是完成了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构