面向对象之多态的理解
2015-05-05 09:54
141 查看
多态,是面向对象三个重要特性之一。也是最能体现出面向对象思想的特性;
那么,什么是多态?
简单讲,就是让一个对象能体现出多种状态(属性);将它形象描述为,若这里有公共汽车、小汽车、火车;但是它们可以抽象为车,使之它们所具有相应的对象和方法。
对于多态,一般他有三种手法表现:
1)虚方法 2)抽象类 3)接口
在这里,我们先对1和2进行描述。
1.虚方法
概念:若有一个实例方法使用virtual关键字,那么这个方法叫做虚方法;
步骤如下:
1、将父类的方法标记为虚方法,使用关键字virtual,这个方法可以将子类重写(override)一遍;
2、将子类赋值给父类,根据父类中的子类对象调用相应的子类方法;
下面以一个例子进行说明:
员工3点下班,经理5点下班,保安4点下班;
解释:我们可以将员工作为父类,其他的作为子类
代码示例
在Main方法中:
打印出上述结果;
总结:对于虚方法的使用,描述多态的特性,父类和子类的方法名必须相同,并且父类使用虚方法,而子类的方法必须使用override进行重写;
2.抽象类
概念:当父类的方法不知道如何实现的时候,可以考虑将父类重写为抽象类,将方法写成抽象方法;
那么,抽象类和虚方法有什么区别?
抽象类的父类没有实现,而虚方法实现;
抽象成员的表示方式:
抽象类的特点:
1)抽象成员必须标记为abstract,并且不能有任何实现;
2)抽象成员必须放在抽象类中;
3)抽象类不能实例化;
4)抽象类中可以写实例成员,并且可以使用子类继承;
5)子类继承抽象类以后,必须把父类的所有抽象成员进行重写;
6)若子类是一个抽象类,可以对他不进行重写;
7)若父类中的抽象方法有参数,那么子类继承重写的方法必须写相应的参数;若抽象父类中的抽象方法又返回值,那么子类的继承重写方法必须也有相应的返回值;
对于,上述的特性,我们通过代码进行演示:
问题:实现一个抽象类,模拟U盘、移动硬盘、MP3在电脑中实现读取;
代码描述:
在Main方法中:
打印结果:
U盘读操作
U盘写操作
附加说明:
1)如果父类中的方法有默认实现,并且父类需要被实例化,这里可以将父类可以考虑成一个普通类,并且使用虚方法,完成多态的实现;
2)如果父类中的方法没有默认实现,并且父类不需要被实例化,那么我们可以考虑将父类作为抽象类,实现多态;
那么,什么是多态?
简单讲,就是让一个对象能体现出多种状态(属性);将它形象描述为,若这里有公共汽车、小汽车、火车;但是它们可以抽象为车,使之它们所具有相应的对象和方法。
对于多态,一般他有三种手法表现:
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)如果父类中的方法没有默认实现,并且父类不需要被实例化,那么我们可以考虑将父类作为抽象类,实现多态;
相关文章推荐
- Java面向对象设计多态特征理解
- 一个经典实例理解继承与多态原理与优点(附源码)---面向对象继承和多态性理解得不够深刻的同学请进
- 面向对象多态的理解
- 【转】面向对象多态的理解
- PHP面向对象深入理解之二(封装、继承、多态、克隆)
- 面向对象之多态理解,多态的作用与好处
- 对于Python面向对象部分的理解(封装继承多态等等)
- 对面向对象中多态的理解
- 对面向对象中多态的理解
- java java面向对象-理解多态思想
- 面向对象_多态的成员访问特点级转型的理解
- 面向对象之封装,继承,多态的理解
- 面向对象第三个特征----多态II(类型判断)
- 面向对象之属性的理解
- 通过js的面向对象来理解jQuery.extend()
- 面向对象复习,深入理解static关键字
- (转)JavaScript 面向对象程序设计(下)——继承与多态
- java基础知识系列---面向对象思想的理解
- java 面向对象个人理解
- 面向对象三要素:封装继承多态的阐述及示例