方式一:多态的实现之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!");
}
}
}
评论
填写昵称与邮箱即可评论,无需登录。