C# 面向对象(多态)
        【摘要】   
 
  在类的继承中,c#允许在基类与派生类中声明具有同名的方法,而且同名的方法可以有不同的代码,也就是说在基类与派生类的相同功能中有不同的事项方法,从而为解决同一问题提供多种途径。
  
 
   
  
   多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为"一个接口,多个功能"。
    多态性可以是静态的或动态的。在静态多态性中,函数的响应...
    
    
    
    
   在类的继承中,c#允许在基类与派生类中声明具有同名的方法,而且同名的方法可以有不同的代码,也就是说在基类与派生类的相同功能中有不同的事项方法,从而为解决同一问题提供多种途径。 
 
 
 
    多态性意味着有多重形式。在面向对象编程范式中,多态性往往表现为"一个接口,多个功能"。 
  
 
  
    多态性可以是静态的或动态的。在静态多态性中,函数的响应是在编译时发生的。在动态多态性中,函数的响应是在运行时发生的。 
  
 
   静态多态性 
  
 
  
    在编译时,函数和对象的连接机制被称为早期绑定,也被称为静态绑定。C# 提供了两种技术来实现静态多态性。分别为: 
  
 
  - 函数重载
 - 运算符重载
 
 动态多态性 
  
 
  
    C# 允许您使用关键字 abstract 创建抽象类,用于提供接口的部分类的实现。当一个派生类继承自该抽象类时,实现即完成。抽象类包含抽象方法,抽象方法可被派生类实现。派生类具有更专业的功能。 
  
 
  
    请注意,下面是有关抽象类的一些规则: 
  
 
  - 您不能创建一个抽象类的实例。
 - 您不能在一个抽象类外部声明一个抽象方法。
 - 通过在类定义前面放置关键字 sealed,可以将类声明为密封类。当一个类被声明为 sealed 时,它不能被继承。抽象类不能被声明为 sealed。
 
   多态的出现提高了代码复用性,扩展性,使后期维护更加方便。 
 
 
 
   多态的弊端:前期定义的内容不能使用(调用)后期子类中的特有内容 
 
 
 
   使用多态的前提: 
 
 
 
   1.想让一个事物具备另一种形态,一定有继承关系(实现) 
 
 
 
   2.要有覆盖。操作父类型。 
 
 
  多态中的成员: 
 
 
 
   Fu f=new Zi(); 
 
 
 
   f.show; 
 
 
  变量: 
 
 
 
   父类形指向子类对象,调用的是父类的变量 
 
 
 
   编译时:参考变量的类型中是否有调用的成员变量,如果有就通过编译,没有就报错 
 
 
 
   运行时:参考变量的类型中是否有调用成员变量,如果没有就运行该类中的变量 
 
 
 
   简单说:编译和运行都看等号左边。 
 
 
  方法: 
 
 
 
   编译时:参考靠变量类型中是否有调用成员变量,如果有就通过编译,没有就报错 
 
 
 
   运行时:参考对象中是否有调用的函数,如果有就调用,如有没有也会调用(父类) 
 
 
 
   简单说:编译看左边,运行看右边。 
 
 
  C#中可以通过多种途径实现多态性: 
 
 
 
   A. 虚方法:将父类方法标记为虚方法,(使用关键字virtual),此方法在子类中可以重写(使用关键字 override) 
 
 
 
   B.抽象类与抽象方法:如果我们不需要使用父类创建对象,他的存在只是为供子类继承。可以将父类写成抽象(关键字abstract)类,将父类方法写成抽象方法,子类中的方法仍用关键字override 重写。 
 
 
 
   C. 接口实现: 
 
 
 
   我们选择使用虚方法实现多态还是抽象写抽象方法实现多态,取决于我们是否使用基类实例化的对象 
 
 
  抽象类:不需要使用基类实例化的对象(利用抽象来实现,类抽象化,方法抽象化,并且方法中不能有方法体{}) 
 
 
  虚方法:需要使用基类实例化的对象 
 
 
 
    
     - 
      
       
      
      
       
        namespace 多态
       
      
 
     - 
      
       
      
      
       
        {
       
      
 
     - 
      
       
      
      
        
       
      
 
     - 
      
       
      
      
        //定义抽象类
       
      
 
     - 
      
       
      
      
        abstract class Vertebrata
       
      
 
     - 
      
       
      
      
       
         {
       
      
 
     - 
      
       
      
      
        //定义抽象函数:绘图
       
      
 
     - 
      
       
      
      
        public abstract void DrawSelf();
       
      
 
     - 
      
       
      
      
        
       
      
 
     - 
      
       
      
      
       
         }
       
      
 
     - 
      
       
      
      
        
       
      
 
     - 
      
       
      
      
        class Zhu : Vertebrata
       
      
 
     - 
      
       
      
      
       
         {
       
      
 
     - 
      
       
      
      
        public override void DrawSelf()
       
      
 
     - 
      
       
      
      
       
         {
       
      
 
     - 
      
       
      
      
       
         Console.WriteLine(@"
       
      
 
     - 
      
       
      
      
       
         ╭︿︿︿╮
       
      
 
     - 
      
       
      
      
       
         {/ o o /} 
       
      
 
     - 
      
       
      
      
       
         ( (oo) ) 
       
      
 
     - 
      
       
      
      
       
         ︶︶︶");
       
      
 
     - 
      
       
      
      
       
         }
       
      
 
     - 
      
       
      
      
       
         }
       
      
 
     - 
      
       
      
      
        
       
      
 
     - 
      
       
      
      
        class QingWa : Vertebrata
       
      
 
     - 
      
       
      
      
       
         {
       
      
 
     - 
      
       
      
      
        public override void DrawSelf()
       
      
 
     - 
      
       
      
      
       
         {
       
      
 
     - 
      
       
      
      
       
         Console.WriteLine(@"
       
      
 
     - 
      
       
      
      
       
         @..@
       
      
 
     - 
      
       
      
      
       
         (\--/)
       
      
 
     - 
      
       
      
      
       
         (.>__<.)
       
      
 
     - 
      
       
      
      
       
         ^^^^^^^^");
       
      
 
     - 
      
       
      
      
       
         }
       
      
 
     - 
      
       
      
      
       
         }
       
      
 
     - 
      
       
      
      
        class Program
       
      
 
     - 
      
       
      
      
       
         {
       
      
 
     - 
      
       
      
      
        static void Main(string[] args)
       
      
 
     - 
      
       
      
      
       
         {
       
      
 
     - 
      
       
      
      
        //声明一个基类Vertebrata类型的数组
       
      
 
     - 
      
       
      
      
       
         Vertebrata[] animals = new Vertebrata[2];
       
      
 
     - 
      
       
      
      
        
       
      
 
     - 
      
       
      
      
        //定义派生类,并存储到数组
       
      
 
     - 
      
       
      
      
       
         animals[0] = new Zhu();
       
      
 
     - 
      
       
      
      
       
         animals[1] = new QingWa();
       
      
 
     - 
      
       
      
      
        
       
      
 
     - 
      
       
      
      
        //使用统一的方法进行调用
       
      
 
     - 
      
       
      
      
        foreach (Vertebrata someone in animals)
       
      
 
     - 
      
       
      
      
       
         {
       
      
 
     - 
      
       
      
      
        //无论是什么动物,都使用相同的语句处理
       
      
 
     - 
      
       
      
      
       
         someone.DrawSelf();
       
      
 
     - 
      
       
      
      
       
         }
       
      
 
     - 
      
       
      
      
       
         }
       
      
 
     - 
      
       
      
      
       
         }
       
      
 
     - 
      
       
      
      
       
        }
       
      
 
    
    
  is运算符 
 
 
 
   is运算符通常用于判断某个对象是不是某种类型。 
 
 
 
    
     - 
      
       
      
      
       
        //假设Human继承自Vertebrata
       
      
 
     - 
      
       
      
      
       
        Human jean=new Human();
       
      
 
     - 
      
       
      
      
       
        Vertebrata someone=jean;
       
      
 
     - 
      
       
      
      
       
        if(someone is Human){
       
      
 
     - 
      
       
      
      
       
          Console.WriteLine("someone is Human");
       
      
 
     - 
      
       
      
      
       
        }
       
      
 
     - 
      
       
      
      
       
        if(someone is Vertebrata){
       
      
 
     - 
      
       
      
      
       
          Console.WriteLine("someone is Vertebrata");
       
      
 
     - 
      
       
      
      
       
        }
       
      
 
    
    
  向上转型 
 
 
 
   由低层次类型转换为高层次类型,称为向上类型转换。向上类型转换是自动进行的,比如把int类型变量赋值给long类型变量,把long类型赋值给double型变量,转换都是自动进行的。 
 
 
 
   由派生类转换为基类,也是向上转换,但基类的引用符不能引用派对生类对象特有的函数。 
 
 
 
    
     - 
      
       
      
      
       
        //假设基类Vertebrata中无work方法,在Human类中定义了work方法
       
      
 
     - 
      
       
      
      
       
           Human jean =new Human();
       
      
 
     - 
      
       
      
      
       
           Vertebrata someone =jean;
       
      
 
     - 
      
       
      
      
          //这个地方是错误的.
       
      
 
     - 
      
       
      
      
       
           someone.Work();
       
      
 
    
    
  向下转型 
 
 
 
   由基类向派生类转换的过程称为向下转换,在这个过程中,需要进行强制转换,同时也可以使用关键字as. 
 
 
 
    
     - 
      
       
      
      
       
        Human jean=new Human();
       
      
 
     - 
      
       
      
      
       
        Vertebrata someone=jean;
       
      
 
     - 
      
       
      
      
        
       
      
 
     - 
      
       
      
      
       
        if(someone is Human){
       
      
 
     - 
      
       
      
      
       
          Human people =(Human)someone; //强制转换
       
      
 
     - 
      
       
      
      
       
          people.Work();
       
      
 
     - 
      
       
      
      
       
        }
       
      
 
    
    
  注意: 
 
 
 
   *只有由基类向派生类转换时,才能强制向下转换,否则程序会抛出异常,所以转换之前 我们使用is运算符进行检查。 
 
 
 
    
     - 
      
       
      
      
       
        Human jean=new Human();
       
      
 
     - 
      
       
      
      
       
        Vertebrata someone=jean;
       
      
 
     - 
      
       
      
      
       
        Human people =someone as Human; //as 运算符
       
      
 
     - 
      
       
      
      
         if(people!=null){
       
      
 
     - 
      
       
      
      
       
         people.Work();
       
      
 
     - 
      
       
      
      
       
          }
       
      
 
    
    
  一个常见的错误:Program has more than one entry point defined. Compile with/main to specify the type that contains the entrypoint. 
 
 
  项目有多个入口点的定义。编译/主要指定类型,其中包含的入口点。 
 
 
文章来源: czhenya.blog.csdn.net,作者:陈言必行,版权归原作者所有,如需转载,请联系作者。
原文链接:czhenya.blog.csdn.net/article/details/76092230
        【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
            cloudbbs@huaweicloud.com
        
        
        
        
        
        
        - 点赞
 - 收藏
 - 关注作者
 
            
           
评论(0)