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 ();

           }

        }

    }

  • 相关阅读:
    [转]解决百度统计 gzdecode(): insufficient memory
    排序二叉树生成
    非递归后序遍历二叉树(1)
    排序方法总结(一)
    匿名自执行函数
    php 判断图片类型
    根据文件的修改日期筛选出目标文件
    js中document的用法小结
    python生成器
    爬虫学习(十九)——Scrapy的学习及其使用
  • 原文地址:https://www.cnblogs.com/0515offer/p/4191906.html
Copyright © 2011-2022 走看看