• c#和Java中的多态


    多态:让一个对象表现出多种类型,写出通用的代码,最大限度的屏蔽各个子类之间的差异性。

    c#举例:

     1 将父类的方法标记为虚方法 ,使用关键字 virtual,这个函数可以被子类重新写一个遍。
     2     
     3        //真的鸭子嘎嘎叫 木头鸭子吱吱叫 橡皮鸭子唧唧叫
     4        RealDuck dk = new RealDuck();
     5        MuDark mk = new MuDark();
     6        XpDark xk = new XpDark();
     7        RealDuck [] dks = { dk,mk,xk};
     8        for (int i = 0; i < dks.Length; i++)
     9       {
    10            dks[i].Jiao();
    11            //调用的仍然是父类的方法,因为表现出来的类型是父类的,所以只能调用父类的方法,但是这个函数在
    12            //子类中被重写了,所以此时就不再调用自己的了,而调用重新写的方法,具体调用哪个子类重写的方法,
    13            //取决于dks[i]装的是谁的对象.
    14        }
    15 
    16     public class RealDuck
    17     {
    18         public virtual void Bark()
    19         {
    20             Console.WriteLine("真的鸭子嘎嘎叫");
    21         }
    22     }
    23      public class MuDuck : RealDuck
    24     {
    25         public override void Bark()
    26         {
    27             Console.WriteLine("木头鸭子吱吱叫");
    28         }
    29     }
    30        public class XPDuck : RealDuck
    31     {
    32         public override void Bark()
    33         {
    34             Console.WriteLine("橡皮鸭子唧唧叫");
    35         }
    36     }
    37 
    38 
    39 //如果不用虚方法,则必须使用里氏转换法
    40 如:   for(int i = 0; i < dks.Length; i++) 
    41        {
    42             if(dks[i] is MuDark)
    43             {
    44                 (MuDark)dks[i].Jiao;
    45             }
    46         }
    47 
    48 关于虚方法需要注意以下几点:
    49 1.虚方法在父类中必须有实现,哪怕是空实现(这点和抽象方法以及接口中的方法不同)
    50 2.虚方法子类可以重写(override),也可以不重写

    Java多态举例:

    多态要注意 的细节:
    	1.  多态情况下,子父类存在同名的成员变量时,访问的是父类的成员变量。
    	2.  多态情况下,子父类存在同名的非静态的成员函数时,访问的是子类的成员函数。
    	3.  多态情况下,子父类存在同名的静态的成员函数时,访问的是父类的成员函数。
    	4.  多态情况下,不能访问子类特有的成员。
    总结:多态情况下,子父类存在同名的成员时,访问的都是父类的成员,除了在同名非静态函数时才是访问子类的。
    编译看左边,运行不一定看右边。
    编译看左边:java编译器在编译的时候,会检查引用类型变量所属的类是否具备指定的成员,如果不具备马上编译报错。
    
    /*
    多态的应用:
      1. 多态用于形参类型的时候,可以接收更多类型的数据 。
      2. 多态用于返回值类型的时候,可以返回更多类型的数据。
    
    
    
    多态的好处: 提高了代码的拓展性。
    
    需求1: 定义一个函数可以接收任意类型的图形对象,并且打印图形面积与周长。
    */
    
    //图形类
    abstract class MyShape{
    
        public abstract void getArea();
    
        public abstract void getLength();    
    }
    
    
    
    class Circle extends MyShape{
    
        public static final double PI = 3.14;
    
        double r;
    
        public Circle(double r){
            this.r =r ;    
        }
    
        public  void getArea(){
            System.out.println("圆形的面积:"+ PI*r*r);
        }
    
        public  void getLength(){
            System.out.println("圆形的周长:"+ 2*PI*r);
        }
    }
    
    
    class Rect  extends MyShape{
    
        int width;
    
        int height;
    
        public Rect(int width , int height){
            this.width = width;
            this.height = height;
        }
    
        public  void getArea(){
            System.out.println("矩形的面积:"+ width*height);
        }
    
        public  void getLength(){
            System.out.println("矩形的周长:"+ 2*(width+height));
        }
    }
    
    
    
    class Demo {
    
        public static void main(String[] args) 
        {
            /*
            //System.out.println("Hello World!");
            Circle c = new Circle(4.0);
            print(c);
    
            Rect r = new Rect(3,4);
            print(r);
            */
            MyShape m = getShape(0); //调用了使用多态的方法,定义的变量类型要与返回值类型一致。
            m.getArea();
            m.getLength();
        }
    
    
        //需求1: 定义一个函数可以接收任意类型的图形对象,并且打印图形面积与周长。
        public static void print(MyShape s){ // MyShpe s = new Circle(4.0);
            s.getArea();
            s.getLength();
        }
    
    
        // 需求2: 定义一个函数可以返回任意类型的图形对象。
        public static MyShape  getShape(int i){
            if (i==0){
                return new Circle(4.0);
            }else{
                return new Rect(3,4);
            }
        }
    
    
    }
  • 相关阅读:
    VBS 操作Word
    VirtualMachineManager
    openssl用法详解
    JS获取浏览器窗口大小 获取屏幕,浏览器,网页高度宽度
    js实现touch移动触屏滑动事件
    JavaScript 获得代码行号和脚本文件名
    js的调用函数前先执行某语句问题
    结构型模式概述(Structural Pattern)
    适配器模式(Adapter Pattern)----------结构型模式
    CSAPP chapter2 记录(bit_level_coding)
  • 原文地址:https://www.cnblogs.com/qicao/p/8934104.html
Copyright © 2020-2023  润新知