面向对象三大特性 之 多态(C#)
今天和勇霞在路上走着讨论了一个问题,什么是"多态".通过讨论得出一个令人震惊的结论,那就是"多态我真的不懂你".学习过程中最大的悲哀莫过于明明是不懂却始终觉得自己很清楚,很明白,我理解,我懂得.很庆幸,因为知道了还不懂多态,接下来必然发生的事情就是我会真正的懂得.哈哈!!
什么是多态?
"多态"一词最早出现在生物学上,生物学的例子解释多态就是,一只牧羊犬生了一窝小牧羊犬,小牧羊犬都遗传了牧羊犬的特征会"叫",但是每一只小牧羊犬的叫声却各不相同,这就是大名鼎鼎的"多态".面向对象中的多态则是同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。更具体点的说法就是通过继承实现的不同对象,调用相同的方法,表现出不同的行为,称之为多态.
多态的实现
多态的实现可以通过静态实现或者动态实现
静态实现多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。
重载方法的定义如下
public int Plus(int x, int y);
public double Plus(double x, double y);
就是相同的方法输入不同的参数,当然返回值可以相同也可以不同.要非常注意的就是方法名必须相同.参数必须不同.
动态实现多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C#中运行时的多态性是通过覆写虚成员接口继承或者直接使用新的派生成员替换基成员来实现的。
覆写
子类中为满足自己的需要来重复定义某个方法的不同实现。通过使用override关键字来实现覆写(只有虚方法和抽象方法才能被覆写)。覆写就是将父类的方法名参数列表返回值原封不动的重新再子类中写一遍,所不同的是将原先虚方法或者抽象方法中的关键字(virtual或者abstract)修改成override
虚方法:使用virtual关键字声明的方法,虚方法定义的时候可以有实现体.运行的时候确定调用的对象是什么类的实例.多态方法的实现如下:
class Animals
{
public virtual void Shout()
{
Console.Write("叫");
}
}
class Wolf: Animals
{
public override void Shout()
{
Console.Write("狼叫");
}
}
class Sheep:Animals
{
public override voidShout()
{
Console.Write("羊叫");
}
}
//wolfsheep都是animal的子类,三个类都有shout()方法,但是各自的实现内容却不一样,此为多态体现之一.
抽象方法:用abstract关键字声明的方法(可以看做是没有实体的虚方法),抽象方法定义的目的就是用来被派生类覆写的,需要注意一点的就是如果类中包含抽象方法,那么类必须被定义成抽象类.多态实现的实例如下:
class Animals
{
public abstract void Shout() ;
}
class Wolf: Animals
{
public override void Shout()
{
Console.Write("狼叫");
}
}
class Sheep:Animals
{
public override voidShout()
{
Console.Write("羊叫");
}
}
接口继承
接口的多态性就是当不同的类持续了相同的接口后,都要按照本身的须要从头实现继承的接口,这样实现出来的结果也不相同,这样实现了多态.实例如下:
public class Wolf : IShout
{
//多态实现
public void Shout()
{
Console.WriteLine("狼叫");
}
}
public class Sheep : IShout
{
//多态实现
public void Shout()
{
Console.WriteLine("羊叫");
}
}
//接口
public interface IShout
{
void Shout();
}
替换
使用新的派生成员替换基类的成员需要使用 new关键字。如果基类定义了一个方法、字段或属性,则 new 关键字用于在派生类中创建该方法、字段或属性的新定义。new关键字放置在要替换的类成员的返回类型之前。例如:
public class FatherClass//定义父类
{
public void Work() { }
public int Field;
public int Property
{
get { return 0; }
}
}
public class SonClass : FatherClass//定义子类继承父类
{
public new void Work() { }//方法替换
public new int Field;//字段替换
public new int Property//属性替换
{
get { return 0; }
}
}
这样多个子类都替换了原来的方法属性和字段就实现了多态.
小结
这就是多态,面向对象设计三大特性中比较难理解的一个,相信多多实践,以后会有更深的理解.