zoukankan      html  css  js  c++  java
  • 多态性(C#)

          在面向对象编程中继承性和多态性是重要机制,前面我为大家分享了我对“类的继承”的理解,哪么今天我就跟大家分享下我对“多态性(C#)”的理解。

          首先我们先来看看多态的定义,同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。

          C#中多态分为两种形式,一种是编译的多态,一种是运行的多态;而所涉及到多态的有重载、重写、虚方法、抽象方法和隐藏方法。

          下面来看看这一段代码,我们从代码中来分析他们的概念及区别:

       public abstract class A

      {

             public abstract void prind();

      }

      public class B:A

          {

               public override void prind()

                {

                      Console.WriteLine("我是B类,我重写了A类的抽象方法prind()");

                }

                public virtual void Bprind()

                {

                       Console.WriteLine("我是B类中的虚方法,我可以被继承B类的派生类重写");

                }

                public void Nprind()

                {

                      Console.WriteLine("Nprind");

                }

       }

       public class C:B

       {

             public override Bprind()

             {

                  Console.WriteLine("我重写了B类的虚方法Bprind");

             }

              new  public void Nprind()

              {

                    Console.WriteLine("我是隐藏Nprind");

              }

             /* 下面是另一种隐藏方法的表现形式

              public new void Nprind()

              {

                    Console.WriteLine("我是隐藏Nprind");

              }

             */

              public void Cprind()

             {

                   Console.WriteLine("我是Cprind方法");

             }

             public void Cprind(string str)

             {

                   Console.WriteLine(str+"我被重载了");

             }

        }

        class D

        {

             static void Main(string []arge)

             {  

                  B b=new B();

                  B bc=new C();

                  C c=new C();

                 //重写抽象方法

                  b.prind();

                 //重写虚方法

                  b.Bprind();

                  bc.Bprind();

                 //隐藏方法

                  b.Nprind();

                  bc.Nprind();

                  c.Nprind();

                 //重载

                  bc.Cprind();

                  bc.Cprind("E");

                  Console.Read();

             }

        }

    输出结果:

    我是B类,我重写了A类的抽象方法prind()

    我是B类中的虚方法,我可以被继承B类的派生类重写

    我重写了B类的虚方法Bprind

    Nprind

    Nprind

    我是隐藏Nprind

    我是Cprind方法

    E我被重载了

    如果单看这段代码可能会看的很费力,所以我们来听听类他们之间的对话。

    D:A类因为你是抽象类,所以你可以定义抽象方法,定义的抽象方法prind可以被继承你的子类重写;因此B类可以重写你的抽象方法prind。

    A:我可以被继承我的子类B重写,哪么我也可以被其他的子类重写咯,也就是说我使用了多态性。

    D:是的你使用了多态性中涉及的抽象方法,因为你的所有子类都可以对你的抽象方法重写,所以你符合了多态性的定义;但你的所有子类都要注意,重写你的抽象方法必须要用到override关键字、修饰符要相同、传递的参数个数和类型也都要一样及方法的返回值都要一样。

    D:B类你自身的Bprind方法是虚方法也可以被继承你的子类重写,不过你和A类不同的是,你自身也可以调用这个虚方法。

    B:为什么Bprind会是虚方法呢?它和别的方法也没什么不同啊,只是多了个virtual关键字而已,难道加了virtual关键字的就是虚方法?

    D:对的,虚方法就是必须要加上virtual关键字,而没有加virtual或别的关键字的我们叫它为非虚方法;也是因为是虚方法才可以重写,非虚方法是不能重写的;但要注意只有继承你的子类才可以重写你的虚方法。

    B:哦,所以C类可以重写我的Bprind这个虚方法。

    D:C类你不但重写了父类B的虚方法,还把B类中的Nprind方法写在了隐藏方法了,而已还对自身的Cprind方法进行了重载。

    C:听到你跟A、B类的对话我知道了我是重写了虚方法,但这个隐藏方法和重载了Cprind方法,又是什么回事呢?

    D:隐藏方法和重写方法差不多,只是关键字不是override,而改成了new;还有不同的是new可以在修饰符前或后。而重载是在同一个作用域中使用了相同的方法名,修饰符、返回值、参数都可以不相同。

    C:隐藏方法我自己能调用吧,但如果实例化父类时引用的是我,哪么调用的应该是我的还是父类的方法呢?

    D:隐藏方法你自己可以,但只有是对你自己实例时调用的才是你,而如果父类实例时引用的是你,哪么调用的将是父类的方法。

          首先我们先从他们对话和给合代码来看看,重载与重写的区别:

                                                重载:                                                 重写:

                 修饰符                    可以不同                                              必须相同                       

           参数个数及类型               可以不同                                              必须相同

                返回值                     可以不同                                              必须相同

                方法名                     必须相同                                              必须相同

          接下来我们来看看抽象方法、隐藏方法、虚方法的注意事项:

           抽象方法:

           1.在基类中定义,派生类中重写。

           2.抽象方法只有在抽象类中才可使用。

           3.抽象类不能实例化。

           4.必须使用abstract。

           隐藏方法:

           1.派生类中定义的和基类中的某个方法名相同。

           2.父类调用父类的方法,而子类调用子类的方法。

           3.使用new关键字,虚方法也能使用。

            虚方法:

            1.在父类中定义的,子类可以重写。

            2.使用virtual关键字。

            注:父类自身也可调用。

  • 相关阅读:
    如何使用KeyChain保存和获取UDID
    ios 使用keychain来存储token
    关于button中设置文字不显示的问题
    实现uitable cell中点击button设置当前cell为选中状态
    setImageEdgeInsets 和 setImage配合使用达到button区域大并可调节其上图片显示区域大小的效果
    C#之Action的实际应用例子
    ConcurrentQueue队列的基本使用方式
    【转】C#中base关键字的几种用法
    C# Activator和new的区别
    C#回调浅析(委托、接口回调)
  • 原文地址:https://www.cnblogs.com/ljhboke/p/5047011.html
Copyright © 2011-2022 走看看