跳到正文

【C#进阶】多态实现的三种方式梳理

方式一:多态的实现之Virtual关键字 多态:(封装和继承都是给我打基础呢,哈哈) -------》虚方法 Virtual override //换一种方式来打卡(一个对象表现多种属性) Console.WriteLine("Virtual 关键字的实现多态:"); foreach(Employee e in emps) { if (e is Manager) { ((Manager)e).DaKa(); } else if (e is Programer) { ((Programer)e).DaKa(); } else { e.DaKa(); } //开始打卡 e.DaKa(); } //员工,经理, 程序猿 class Employee { //父类的打卡被子类重写了(virtual的关键字实现多态) public virtual void DaKa() { Console.WriteLine("Employee Daka"); } } class Manager : Employee { public void DaKa() { Console.WriteLine("Manager Daka"); } } class Programer : Employee { public void DaKa() { Console.WriteLine("Programer Daka"); } } -------》抽象类 Abstract override abstract class Person { public abstract void SayHello(); public abstract void Test(); public abstract int SayHi(); //抽象类是有构造函数的, 但是自己并不能实例化; 可以由子类来使用 public Person() { } } abstract class Student : Person { //子类也声明我抽象类, 可以不用全部实现父类的抽象函数 public override void SayHello() { throw new NotImplementedException(); } } 方式二:多态的实现之抽象类 264 using System; using System.Collections.Generic; using System.Linq; using System.Text; //抽象类实现多态练习 namespace ConsoleApp1 { class Class4 { static void Main(string args) { //这有三个移动设备 MobileDisk md = new MobileDisk(); Mp3 mp3 = new Mp3(); UDisk uDisk = new UDisk(); AirPhone airPhone = new AirPhone(); //方法一: Computer cpu = new Computer(); cpu.MS = airPhone;//mp3; //把电脑的当前连接设备设置为MP3(set方法) cpu.CPUWrite(); cpu.CPURead(); mp3.PlayMusic(); //自己来播放音乐 //方法二:通过电脑来读取数据 Computer computer = new Computer(); computer.CPURead(md); computer.CPUWrite(md); } } //不同的设备 abstract class MobileStorage { abstract public void Read(); abstract public void Write(); } class MobileDisk : MobileStorage { public override void Read() { Console.WriteLine("移动硬盘在读取数据!"); } public override void Write() { Console.WriteLine("移动硬盘在写入数据!"); } } class UDisk : MobileStorage { public override void Read() { Console.WriteLine("UDisk在读取数据!"); } public override void Write() { Console.WriteLine("UDisk在读取数据!"); } } class Mp3 : MobileStorage { public override void Read() { Console.WriteLine("MP3在读取数据!"); } public override void Write() { Console.WriteLine("MP3在读取数据!"); } //这个是我的这个子类的特有属性 public void PlayMusic() { Console.WriteLine("MP3在播放音乐!"); } } //把耳机也接入了电脑 class AirPhone : MobileStorage { public override void Read() { Console.WriteLine("耳机在读数据!"); } public override void Write() { Console.WriteLine("耳机在写数据!") ; } } //我的电脑 class Computer { //方法一: 通过自动属性的方法 public MobileStorage MS { get; set; } public void CPURead() { this.MS.Read(); } public void CPUWrite() { this.MS.Write(); } //方法二:通过传参的方法 public void CPURead(MobileStorage ms) { ms.Read(); } public void CPUWrite(MobileStorage ms) { ms.Write(); } } } 使用原则:父类可以创建对象,父类的函数有意义,就使用虚方法;父类没有必要创建对象,父类的函数没有意义, 就使用抽象类。(抽象类也是可以有构造函数的) 方式三:多态的实现之接口 对接口的理解:-----》接口是一种能力-----》接口也是一种规范,如果继承了接口,就必须按照接口的要求来实现这个接口 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApp3 { class Class5 { static void Main(string args) { //实现多态(面向父类编程/面向接口编程; 可以写出更为通用的代码,更好适应需求的不断改变【核心作用】) IKouLan kouLan = new Teacher();//new NBAPlayer(); kouLan.KouLan(); //IKouLan kouLan = new NoLegPerson(); //error Console.ReadKey(); } } class Person { public void Activity() { Console.WriteLine("activity"); } } class Player { public void Play() { Console.WriteLine("play a basketball !"); } } //接口的引出:一个子类只能继承一个父类, 如果想要继承多个父类; 就使用我接口来实现吧!(解决了继承的单根性问题!) interface IKouLan { void KouLan(); } //class NBAPlayer : Person, Player ///error: 违反了继承的单根性质 //{ //} //接口的实现(多重继承): 接口更侧重于一种能力; 并非每一个人都有扣篮的这个能力 class NBAPlayer : Person, IKouLan { public void KouLan() { Console.WriteLine("NBAPlayer play basketball"); } } class Teacher : IKouLan { public void KouLan() { Console.WriteLine("Teacher is play ***"); ; } } class NoLegPerson { public void KouLan() { Console.WriteLine("I could't play basketball!"); } } }

评论

填写昵称与邮箱即可评论,无需登录。

推荐阅读