设计模式学习笔记二:面向对象基础三之多态

多态
    多态是面向对象的第三大特性。多态表示不同的对象可以执行相同的动作,但要通过他们自己的实现代码来执行。举例说明:
国粹京剧以前都是子承父业,代代相传的艺术,假设有一对父子,父亲是非常出名的京剧艺术家,儿子也已长大成人,且模仿父亲的戏惟妙惟肖。有一天父亲病了,不能登台演出,而票早就卖出,退票是会严重影响声誉。怎么办呢?由于京剧是化妆后表演,于是最好的办法就是由儿子待父亲上台表演。
    这里面有几点注意:第一,子类以父类的身份出现。儿子代表老子表演,化妆后就是一父亲的身份出现了。第二 ,子类在工作中以自己的方式来实现。儿子模仿的再好,儿子也只能以自己理解的表现方式去模仿父亲的表演。第三,子类以父类的身份出现时,子类特有的属性和方法不可以使用。儿子通过多年的学习,其实早已有了自己的东西。但在此时,代表父亲表演,绝对是不能表现出来的。这就是多态
    虚方法:为了使子类的实例完全接替来自父类的类成员,父类必须将该成员声明为虚拟的。这是通过再改成员的返回类型前加virtual关键词来实现。通常虚拟的是方法。其实除了字段不能是虚拟的外,属性、事件、和索引器都可以是虚拟的。尽管方法可以是虚拟的,但虚方法还是有方法体,可以实际做些事。子类可以选择使用override关键字,将父类实现替换为他自己的实现,这就是方法重写Override,或叫做方法覆写。
    动物基类:

     ///  
    
/// 父类
    
///  

     public   class  Animal
    {
         
protected   string  name  =   "" ;
         
protected   int  shoutNum  =   3 ;
         
public  Animal( string  name)
         {
             
this .name  =  name;
         }
         
public  Animal()
         {
             
this .name  =   " 无名 " ;
         }
        
///  
        
///  虚方法
        
///  

        
///  
         public   virtual   string  Shout()
        {
            
return   "" ;
        }
    }

猫子类:

     ///  
    
///  Cat子类
    
///  

     public   class  Cat:Animal 
    {
        
public  Cat()
            : 
base ()
        { }
        
public  Cat( string  name)
            : 
base (name)
        { }

        
public   override   string  Shout()
        {
            
string  result  =   "" ;
            
for  ( int  i  =   0 ; i  <  shoutNum; i ++ )
            {
                result 
=  result  +   " 嘧, " ;
            }
            
return   " 我的名字叫 "   +  name  +   "   "   +  result; 
        }
    }
狗子类:
     ///  
    
///  Dog子类
    
///  

     public   class  Dog : Animal
    {
        
public  Dog()
            : 
base ()
        { }
        
public  Dog( string  name)
            : 
base (name)
        { }

        
public   override   string  Shout()
        {
            
string  result  =   "" ;
            
for  ( int  i  =   0 ; i  <  shoutNum; i ++ )
            {
                result 
=  result  +   " 汪, " ;
            }
            
return   " 我的名字叫 "   +  name  +   "   "   +  result;
        }
    }

动物叫声大赛:
     public   class  Match
    {
        
private  Animal[] arrAnimal;

        
private   string   ShoutMatch()
        {
            
string  Result  =   "" ;
            arrAnimal 
=   new  Animal[ 2 ];
            arrAnimal[
0 =   new  Cat( " 小花 " );
            arrAnimal[
1 =   new  Dog( " 阿毛 " );

            
foreach  (Animal item  in  arrAnimal)
            {
                Result 
=  Result  +  item.Shout() + " ; " ;
            }
            
return  Result;
        }
    }

    Animal相当于京剧的父亲,Cat和Dog相当于儿子,儿子代表父亲表演Shout,但是Cat叫出来的嘧,Dog叫出来的汪。这就是 不同的对象可以执行相同的动作,但要通过他们自己的实现代码来执行。
    注意:对象的声明必须是父类,而不是子类,实例化的对象是子类。
    多态的原理是当方法被调用时,无论对象是否被转化为其父类,都只有位于对象继承链最末端的方法实现会被调用。也就是说,虚方法是按照其运行时类型而非编译时类型进行动态绑定调用。

你可能感兴趣的:(设计模式学习笔记二:面向对象基础三之多态)