您的位置:首页 > 其它

面向对象之多态的理解

2015-05-05 09:54 141 查看
多态,是面向对象三个重要特性之一。也是最能体现出面向对象思想的特性;

那么,什么是多态?

简单讲,就是让一个对象能体现出多种状态(属性);将它形象描述为,若这里有公共汽车、小汽车、火车;但是它们可以抽象为车,使之它们所具有相应的对象和方法。

对于多态,一般他有三种手法表现:

1)虚方法 2)抽象类 3)接口

在这里,我们先对1和2进行描述。

1.虚方法

概念:若有一个实例方法使用virtual关键字,那么这个方法叫做虚方法;

public vitual void say()//虚方法
{
}


步骤如下:

1、将父类的方法标记为虚方法,使用关键字virtual,这个方法可以将子类重写(override)一遍;

2、将子类赋值给父类,根据父类中的子类对象调用相应的子类方法;

下面以一个例子进行说明:

员工3点下班,经理5点下班,保安4点下班;

解释:我们可以将员工作为父类,其他的作为子类

代码示例

public class Employe   //员工类
{
public virtual void Daka()  //员工虚方法
{
Console.WriteLine("员工3点下班");
}
}
public class Manssager : Employe  //经理类
{
public override void Daka()
{
Console.WriteLine("经理5点下班");
}
}
public class Safey : Employe   //保安类
{
public override void Daka()
{
Console.WriteLine("保安4点下班");
}
}


在Main方法中:

Manssager ms = new Manssager();//经理对象
Pragrammer sf = new Safey();//保安对象
Employe em = new Employe(); //员工对象
Employe[] ems = { em, ms, sf };
for (int i = 0; i < ems.Length; i++)
{
ems[i].Daka();
}


打印出上述结果;

总结:对于虚方法的使用,描述多态的特性,父类和子类的方法名必须相同,并且父类使用虚方法,而子类的方法必须使用override进行重写;

2.抽象类

概念:当父类的方法不知道如何实现的时候,可以考虑将父类重写为抽象类,将方法写成抽象方法;

那么,抽象类和虚方法有什么区别?

抽象类的父类没有实现,而虚方法实现;

抽象成员的表示方式:

public abstract class A   //抽象类
{
public abstract void B();//抽象方法
}


抽象类的特点:

1)抽象成员必须标记为abstract,并且不能有任何实现;

2)抽象成员必须放在抽象类中;

public abstract class Aminal
{
public abstract void B();
}


3)抽象类不能实例化;

4)抽象类中可以写实例成员,并且可以使用子类继承;

```
public abstract class Aminal
{
public abstract void B();
public void c()
{
//实例方法
}
}
public class minal:Aminal
{

}


5)子类继承抽象类以后,必须把父类的所有抽象成员进行重写;

public abstract class Aminal
{
public abstract void B();
}
public class cat:Aminal
{
public override void B()
{
//子类方法重写
}
}


6)若子类是一个抽象类,可以对他不进行重写;

public abstract class Aminal
{
public abstract void B();
}
public abstract class minal:Aminal
{
//抽象成员或者实例成员
}


7)若父类中的抽象方法有参数,那么子类继承重写的方法必须写相应的参数;若抽象父类中的抽象方法又返回值,那么子类的继承重写方法必须也有相应的返回值;

public abstract class Aminal
{
public abstract string A(int b);
}

public class cat:Aminal
{
public override string A(int b);//重写子类继承方法,
}


对于,上述的特性,我们通过代码进行演示:

问题:实现一个抽象类,模拟U盘、移动硬盘、MP3在电脑中实现读取;

代码描述:

public abstract class MobileStrage  //移动设备类
{
public abstract void Read();//抽象读方法
public abstract void Write();//抽象写方法
}
public class UDisk : MobileStrage   //U盘类
{

public override void Read()   //重写U盘读操作
{
Console.WriteLine("U盘读操作");
}

public override void Write() //同上
{
Console.WriteLine("U盘写操作");
}
}
public class MP3 : MobileStrage   //MP3类
{

public override void Read()
{
Console.WriteLine("MP3读操作");
}

public override void Write()
{
Console.WriteLine("MP3写操作");
}
public void palyMusic()
{
Console.WriteLine("MP3播放音乐");
}
}
public class MoblieDisk : MobileStrage   //移动硬盘类
{

public override void Read()
{
Console.WriteLine("移动硬盘读操作");
}

public override void Write()
{
Console.WriteLine("移动硬盘写操作");
}
}

public class Computer    //电脑类
{
private MobileStrage _ms;  //定义移动设备类属性
public MobileStrage Ms
{
get { return _ms; }
set { _ms = value; }
}
public Computer(MobileStrage ms)   //构建构造函数
{
this.Ms = ms;
}
public void cpuRead()
{
Ms.Read();
}
public void cpuWrite()
{
Ms.Write();
}
}


在Main方法中:

Computer cpu = new Computer(new UDisk());//向电脑中模拟插入U盘
cpu.cpuRead();//cpu读
cpu.cpuWrite();//cpu写
Console.ReadKey();


打印结果:

U盘读操作

U盘写操作

附加说明:

1)如果父类中的方法有默认实现,并且父类需要被实例化,这里可以将父类可以考虑成一个普通类,并且使用虚方法,完成多态的实现;

2)如果父类中的方法没有默认实现,并且父类不需要被实例化,那么我们可以考虑将父类作为抽象类,实现多态;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: