C#之多态
来源:互联网 发布:keil c51keil软件仿真 编辑:程序博客网 时间:2024/05/23 13:39
一、什么是多态
简单来说,多态就是对象可以表现多个类型的能力,同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。可以把一组对象放到一个数组中,然后调用它们的方法,在这种场合下,多态性作用就体现出来了,这些对象不必是相同类型的对象。当然,如果它们都继承自某个类,你可以把这些派生类,都放到一个数组中。如果这些对象都有同名方法,就可以调用每个对象的同名方法。
二、几种建立多态的方式
1、用父类实现多态
多个类可以从单个基类“继承”。通过继承,类在基类所在的同一实现中接收基类的所有方法、属性和事件。这样,便可根据需要来实现附加成员,而且可以重写基成员以提供不同的实现。
(1、)使用new修饰符隐藏父类的成员
在子类中,可用new修饰符隐藏父类的成员,隐藏父类的成员意味着该成员的派生版本将替换基类版本。在不使用 new 修饰符的情况下隐藏成员是允许的,但会生成警告。使用 new 显式隐藏成员会取消此警告,并记录代之以派生版本这一事实。
class Program { static void Main(string[] args) { Aniaml a = new Aniaml(); a.Eat(); Dog dog = new Dog(); dog.Eat(); Aniaml animal = dog; //dog对象赋给animal变量 animal.Eat(); //调用dog的Eat旧方法—父类的方法 } } class Aniaml //定义动物类Animal { public void Eat() { Console.WriteLine("动物吃东西"); } } class Dog : Aniaml //定义Dog类,从Animal派生 { new public void Eat() //new隐藏父类成员 { Console.WriteLine("狗吃骨头"); } }可以理解为,使用new关键字后,使得Dog中的Eat方法和Animal中的Eat方法成为毫不相关的两个方法,只是它们的名字碰巧相同而已。
(2、)使用override重载父类成员实现多态
virtual供父类的函数成员使用,表明是虚拟的成员
override供子类的函数成员使用,表明是重载的成员
父类的虚拟函数可以被重载,其他的成员不可以被重载
class Program { static void Main(string[] args) { Dog dog = new Dog(); Cat cat = new Cat(); Aniaml animal = dog ; //dog对象赋给animal变量 animal.Eat(); //继承的父类方法已被完全覆盖,等价于dog.Eat() animal = cat; animal.Eat(); //等价于cat.Eat() } } class Aniaml //定义动物类Animal { public virtual void Eat() { Console.WriteLine("动物吃东西"); } } class Dog : Aniaml //定义Dog类,从Animal派生 { public override void Eat() { Console.WriteLine("狗吃骨头"); } } class Cat : Aniaml { public override void Eat() { Console.WriteLine("猫吃鱼"); } }子类重载父类的虚拟函数,然后由父类变量引用不同子类对象的同名函数,同样的animal.Eat方法,运行结果不同,这是行为多态性。
2、用抽象类实现多态
抽象类同时提供继承和接口的元素。抽象类本身不能实例化,它必须被继承。该类的部分或全部成员可能未实现,该实现由继承类提供。已实现的成员仍可被重写,并且继承类仍可以实现附加接口或其他功能。
class Program { static void Main(string[] args) { Dog dog = new Dog(); dog.Eat(); Console.ReadKey(); } } public abstract class Aniaml //定义抽象类Animal { public abstract void Eat(); //定义抽象方法Eat } class Dog : Aniaml //定义Dog类,从Animal派生 { public override void Eat() { Console.WriteLine("狗吃骨头"); } }抽象方法只是对方法进行了定义,而没有实现,如果一个类包含了抽象方法,那么该类也必须用abstract声明为抽象类,一个抽象类是不能实例化的。
3、用接口实现多态
多个类可实现相同的“接口”,而单个类可以实现一个或多个接口。接口本质上是类需要如何响应的定义。接口描述类需要实现的方法、属性和事件,以及每个成员需要接收和返回的参数类型,但将这些成员的特定实现留给实现类去完成。
interface IShout //定义接口IShout { void IShout(); } class Program { static void Main(string[] args) { Dog dog = new Dog(); dog.IShout(); Cat cat = new Cat(); cat.IShout(); } } class Dog :IShout //实现接口IShout { public void IShout() { Console.WriteLine("我会叫"); } } class Cat :IShout //实现接口IShout { public void IShout() { Console.WriteLine("我也会叫"); } }狗会叫,猫也会叫,它们都有会叫的能力,因此可以通过定义和实现接口来实现功能的添加,也实现了多态性。
以上是自己关于C#多态的一个简单总结,不断努力,不断进步。。。
- C#之多态
- C#之多态
- 【黑马程序员】C#之多态
- C#面向对象之多态
- C# 面向对象之多态
- 黑马程序员-C#面向对象之多态
- C#学习二之多态的实现
- c#之多态的一个应用
- C#学习笔记之多态之接口
- c#面向对象特征(2)之多态
- C#之多继承
- c#之多线程基本概念
- 论C#之多继承
- 黑马程序员——C#面向对象之多态
- 新手菜鸟学习C#的笔记总结 之多态
- C#学习笔记之多态之虚方法
- C#学习笔记之多态之抽象类
- C#编程入门_面向对象之多态_11
- C语言基础(二)
- lua 垃圾回收标记函数 reallymarkobject
- 防重复请求处理的实践与总结
- python集合
- Bresenham算法
- C#之多态
- 使用nuget发布自己写的类库
- C语言基础(三)
- 会话发起协议——SIP
- 为什么要做一些事
- HTML5之应用缓存
- XML介绍
- Java语言基础
- TreeSet