C#多态

1:重写父类方法

1:重写父类方法
父类方法:virtual
子类方法:override
示例:

       static void Main(string[] args)
        {
            Dog a1 = new Dog ();
            a1.Shot();
            Console.ReadKey();
        }
        class Animal//父类方法
        {
            public virtual void Shot()//★virtual
            {
                Console.WriteLine("动物可以叫!");
            }
        }
        class Dog:Animal//Dog类继承父类
        {
            public override void Shot()//★override
            //★子类重写父类方法:数据类型-个数-返回值类型完全和父类相同★
            {
                Console.WriteLine("狗可以叫!");
            }
        }

在这里插入图片描述
①:子类重写父类方法时,不能使用比父类中被重写的方法更严格的访问权限
②:重写父类方法要求子类方法名,参数类型和参数个数必须与父类相同

2:多态实现

2:多态实现(目的:程序更加灵活)
同一个操作,作用于不同的对象,会产生不同现象
示例:

        static void Main(string[] args)
        {
            //方法1:
            A a=new B();//子类可以new一个父类对象
            //★分析:Dog属于动物,但是动物不一定全是Dog
            Console.WriteLine("方法1:");
            a.Print();
            //★new谁
            //方法2:
            A a1 = new A();
            //同类进行new
            B b = new B();
            Console.WriteLine("方法2:");
            a1.Print();
            b.Print();
            Console.ReadKey();
        }
        class A//父类
        {
            public virtual void Print()//virtual
            {
                Console.WriteLine("父类输出:A");
            }
        }
        class B:A//子类
        {
            public override void Print()//override
            {
                 Console.WriteLine("子类输出:B");
            }
        }

在这里插入图片描述
①:通过子类new一个父类对象
②:同类new对象

3:里氏转换原则

3:里氏转换原则(子类与父类之间的转换)
①:子类作为父类——>直接赋值(例如:狗一定是动物,但是动物不一定全是狗)
示例:

        static void Main(string[] args)
        {
            Animal a1 = new Dog();//★Dog类作为父类,按照原则直接赋值操作!
            a1.Shout();
            //谁new,调谁
            Animal a2 = new Cat();//★Cat类作为父类,按照原则直接赋值操作!
            a2.Shout();
            //谁new,调谁
            Console.ReadKey();
        }
        class Animal//父类
        {
            public virtual void Shout()
            {
                Console.WriteLine("动物有自己的叫声!");
            }
        }
        class Dog:Animal//子类
        {
            public override void Shout()
            {
                Console.WriteLine("小狗:旺旺...");
            }
        }
        class Cat:Animal//子类
        {
            public override void Shout()
            {
                Console.WriteLine("小猫:喵喵...");
            }
        }

在这里插入图片描述

②:父类作为子类——>强制转换。
(注:强制转换易报错,建议使用is/as操作。①:is只能判断bool类型②:as判断同时可以转换)
示例强制转换:

        static void Main(string[] args)
        {
            Animal a = new Dog();
            //Animal类中不单单有Dog类
            Dog dog = (Dog)a;
            //为了转换更加准确,对a进行限制,将Dog类的a全部实例化dog对象
            dog.Shout();
            Console.ReadKey();
        }
        class Animal//父类
        {
            public virtual void Shout()
            {
                Console.WriteLine("动物有自己的叫声!");
            }
        }
        class Dog : Animal//子类
        {
            public override void Shout()
            {
                Console.WriteLine("小狗:旺旺...");
            }
        }

在这里插入图片描述
示例is操作:

         static void Main(string[] args)
        {
            Animal a = new Dog();
             bool result =a is Dog;//判断a是否为Dog类
             if(result)
             {
                 Console.WriteLine("可以进行强制转换!");
             }
             else
             {
                 Console.WriteLine("强制转换出错!");
             }
             Console.ReadKey();
        }
        class Animal//父类
        {
             public virtual void Shout()
             {
                 Console.WriteLine("动物有自己的叫声!");
             }
         }
         class Dog : Animal//子类
         {
             public override void Shout()
             {
                 Console.WriteLine("小狗:旺旺...");
             }
         }

在这里插入图片描述
示例as操作:

         static void Main(string[] args)
        {
            Animal a = new Dog();//子类new父类对象
             Dog dog=a as Dog;
             //使用as关键字判断a对象是否可以转换为Dog类型,如果可以进行转换,如果不可以则为null
             if(dog!=null)
             {
                 Console.WriteLine("可以转换!");
                 dog.Shout();
             }
             else
             {
                 Console.WriteLine("无法转换!");
             }
             Console.ReadKey();
        }
         class Animal//父类
         {
             public virtual void Shout()
             {
                 Console.WriteLine("动物有自己的叫声!");
             }
         }
         class Dog : Animal//子类
         {
             public override void Shout()
             {
                 Console.WriteLine("小狗:旺旺...");
             }
         }

在这里插入图片描述

4:Object类

4:Object类(所有类的父类,每一个类直接或者间接继承该类)
①:子类可以调用Object类内的方法。

        static void Main(string[] args)
        {
            A a = new A();
            Console.WriteLine("Object:" + a.ToString());
            //Object类是任何类的父类  
            //对象可以直接调用Object类内方法
            Console.ReadKey();
        }
        class A
        {
            public void Print()
            {
                Console.WriteLine("Print:A");
            }
        }

在这里插入图片描述
常用Object方法:
在这里插入图片描述

②:重写Object类方法
对比(new重写和override重写)
重写两种方法:
①new操作:对父类方法进行隐藏,其他类同样无法访问父类中方法。

②override操作:在子类内部对父类方法进行操作,其他类同样可以操作父类中方法。*
示例:

        static void Main(string[] args)
        {
            A a = new A();
            Console.WriteLine("重写Object类方法Tostring成功:"+a.ToString());
            Console.ReadKey();
        }
        class A
        {
            public override string ToString()
            //★public override void ToString()  如果直接这样写会报错
            //★报错内容为:Tostring重写需要为string返回类型★
            {
                return "重写Object类中Tostring方法.";
            }
        }

在这里插入图片描述

每天进步一点点!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AuCl.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值