• c#基础学习汇总----------base和this,new和virtual


    base和this是c#中的两访问关键字,目的是用于实现继承机制的访问操作,来满足对对象成员的访问,从而为多态机制提供更加灵活的处理方式。

    在看《你必须知道的.Net》一书中有一个例子很好的解释了base和this的用法。也很好的诠释了继承的概念,现附上书中代码:

        class Action
        {
            public static void ToRun(Vehicle vehicle)
            {
                Console.WriteLine("{0} is running",vehicle.ToString());
            }
        }
    
        public class Vehicle
        {
            private string name;
            private int speed;
            private string[] array = new string[10];
    
            public Vehicle()
            { }
    
            public Vehicle(string name, int speed)
            {
                this.name = name;
                this.speed = speed;
            }
    
            public virtual void ShowResult()
            {
                Console.WriteLine("The top speed of{0} is {1}.",name,speed);
            }
            public void Run()
            {
                Action.ToRun(this);
            }
            public string this[int param]
            {
                get { return array[param]; }
                set { array[param] = value; }
            }
        }
    
        public class Car : Vehicle
        {
            public Car()
                : base("Car", 200)
            { }
            public Car(string name, int speed)
                : this()
            { }
            public override void ShowResult()
            {
                base.ShowResult();
                Console.WriteLine("It's a car's result");
            }
        }
    
        public class Audi : Car
        {
            public Audi()
                : base("Audi", 300)
            { }
            public Audi(string name,int speed)
                : this()
            { }
            public override void ShowResult()
            {
                   base.ShowResult();
                   base.Run();
                   Console.WriteLine("It's audi's result.");
            }
    
        }
        class Program
        {
            static void Main(string[] args)
            {
                Audi audi = new Audi();
                audi[1] = "A6";
                audi[2] = "A8";
                Console.WriteLine(audi[1]);
                audi.Run();
                audi.ShowResult();
    
                Console.Read();
            }
        }

    上边的代码,试着把子类Audi覆写的ShowResult()的override改为new,然后在客户端处理类里Vehicle ve = new Audi();ve.run();ve.ShowResult();

    这样对于new隐藏继承成员和override覆写的层次顺序就会有更加清楚的概念。一方面了解了base作为和直接基类进行通信的方法以及this的基本用法,又复习了下通过基类继承来实现多态的方法。调用虚函数,进一步逐一判断是否在子类进行override覆写,若覆写就调用最后一个层次继承类的覆写方法,若没有则直接调用基类的虚方法。我想这大概也是这种多态的实现取决于运行时而非编译时的道理吧。

    1.把new和Virtual总结一下:

    实现派生类中隐藏方法,则基类方法必须定义为virtual,这主要是针对版本控制而言,将基类方法实现为virtual能够同时保证向前扩展和向后兼容,在派生类中通过new或override进行灵活控制;new作为修饰符,实现隐藏基类成员时,不可和override共存,但可以和virtual共存。new用于实现创建一个新成员,同时隐藏基类的同名成员;而override用于实现对基类成员的扩展。

    2.base和this总结一下:

    base常用于在派生类对象初始化时和基类进行通信。

    base可以访问基类的公有成员和受保护成员,私有成员不可访问。

    this指代类对象本身,用于访问本类的所有常量,字段,属性和方法成员,不管访问元素是任何访问级别。因为this仅仅局限于对象内部,对象外部无法看到,这就是this的基本思想。另外,静态成员不是对象的一部分,因此不能再静态方法中引用this。

    在多层继承中,base可以指向父类的方法有两种:一是有覆写存在的存在的情况,base将指向直接继承的父类成员的方法;在没有覆写存在的情况下,base可以指向任何上级父类的公有或者受保护的方法。

  • 相关阅读:
    win8 vs2010 openni2 配置
    写一个程序,分析一个文本文件(英文文章)中各个词出现的频率,并且把频率最高的十个词打印出来。
    电梯调度
    new 一个button 然后dispose,最后这个button是null吗???
    org.apache.hadoop.security.AccessControlException
    算法导论第二章、插入排序
    算法导论第六章、堆排序
    算法导论第八章、计数排序
    观后感
    第二次随笔
  • 原文地址:https://www.cnblogs.com/lxGIS/p/3334805.html
Copyright © 2020-2023  润新知