zoukankan      html  css  js  c++  java
  • 虚方法(virtual)

    虚方法(virtual)

    Virtual 关键字用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象。

    看一段代码:

    using System ;

    class A

    {

        public void F()

        {

           Console.WriteLine ("A.F");

        }

    }

    class B:A

    {

        public new void F() //注意new关键字

        {

           Console.WriteLine ("B.F");

        }

    }

    class Test

    {

        static void Main()

        {

           B b = new B ();

           A a = b;

           a.F ();

           b.F();

        }

    }

    输出: A.F

           B.F

    上述代码在内存中如下图:

     

     

     

    再看一段代码:

    using System ;

    class A

    {

        public virtual void F()

        {

           Console.WriteLine ("A.F");

        }

    }

    class B:A

    {

        public override void F()

        {

           Console.WriteLine ("B.F");

        }

    }

    class C:B

    {

        public new   void F()

        {

           Console.WriteLine ("C.F");

        }

    }

    class Test

    {

        static void Main()

        {

           C c = new C ();

           A a = c;

           a.F();

        }

    }

    输出: B.F

    ->基类的成员会搜索继承链,找到使用了new修饰符的那个成员之前的成员,然后调用该成员。

    多态(polymorphism):

    多态是指两个或多个属于不同类的对象,对同一个消息做出不同响应的能力。

    ->virtual 和 override 关键字 : 多态给子类提供了一种方式,可以自定义如何实现基类所定义的方法;

    看下面代码:

    using System ;

    class Employee

    {

        protected string _name;

        public Employee () {}

        public Employee (string name)

        {

           _name = name ;

        }

        public virtual void StartWork()

        {

           Console.WriteLine (_name+"开如工作");

        }

    }

    class Manager:Employee

    {

        public Manager (string name):base (name){}

        public override void StartWork()

        {

           base .StartWork (); //注意base的使用

           Console .WriteLine ("下达任务");

        }

    }

    class Seller:Employee

    {

        public Seller (string name):base (name){}

        public override void StartWork()

        {

           base .StartWork ();

           Console .WriteLine ("销售产品");

        }

    }

    class Test

    {

        static void Main()

        {

           Employee [] emp = new Employee[2] ;

           emp [0]=new Manager ("张三");

           emp [1]=new Seller ("李四");

           foreach (Employee e in emp )

           {

               e.StartWork ();

           }

        }

    }

  • 相关阅读:
    【Lintcode】112.Remove Duplicates from Sorted List
    【Lintcode】087.Remove Node in Binary Search Tree
    【Lintcode】011.Search Range in Binary Search Tree
    【Lintcode】095.Validate Binary Search Tree
    【Lintcode】069.Binary Tree Level Order Traversal
    【Lintcode】088.Lowest Common Ancestor
    【Lintcode】094.Binary Tree Maximum Path Sum
    【算法总结】二叉树
    库(静态库和动态库)
    从尾到头打印链表
  • 原文地址:https://www.cnblogs.com/0515offer/p/4191906.html
Copyright © 2011-2022 走看看