• C#中base关键字的几种用法


    base其实最大的使用地方在面相对性开发的多态性上,base可以完成创建派生类实例时调用其基类构造函数或者调用基类上已被其他方法重写的方法。
    例如:

    2.1关于base调用基类构造函数
    复制代码
    public class A
    {
            public A()
            {
                    Console.WriteLine("Build A");
            }
    }
    public class B:A
    {
            public B():base()
            {
                    Console.WriteLine("Build B");
            }
            static void Main()
            {
                    B b = new B();
                    Console.ReadLine();
            }
    }
    复制代码
    创建一个B的实例对象,获得结果是同时打印Build A和Build B.

    2.2关于base在派生类中调用基类的方法。
    复制代码
    public class A
    {
            public virtual void Hello()
            {
                    Console.WiriteLine("Hello");
            }
    }
    public class B : A
    {
            public override void Hello()
            {               
                    base.Hello();//调用基类的方法,显示Hello
                    Console.WiriteLine("World");
            }
    }
    复制代码
    这样如果程序调用B.Hello()获得的效果将会使Hello World.

    最后补充下,根据MSDN Library介绍来看这两个关键字都是属于[访问关键字]类型
     
    +++++++++++++++++++++++++++++ 无敌分割线 +++++++++++++++++++++++++++++
    +++++++++++++++++++++++++++++ 文章二 +++++++++++++++++++++++++++++
     
    关于base
    base 关键字用于从派生类中访问基类的成员:
    调用基类上已被其他方法重写的方法。
    指定创建派生类实例时应调用的基类构造函数。
    基类访问只能在构造函数、实例方法或实例属性访问器中进行。

    示例:
    1. 在派生类中调用基类方法。
    复制代码
    using System;
    public class BaseClass
    {
        protected string _className = "BaseClass";
        public virtual void PrintName()
        {
            Console.WriteLine("Class Name: {0}", _className);
        }
    }
    class DerivedClass : BaseClass
    {
        public string _className = "DerivedClass";
        public override void PrintName()
        {
            Console.Write("The BaseClass Name is {0}");
            //调用基类方法
            base.PrintName();
            Console.WriteLine("This DerivedClass is {0}", _className);
        }
    }
    class TestApp
    {
        public static void Main()
        {
            DerivedClass dc = new DerivedClass();
            dc.PrintName();
        }
    }
    复制代码

    2. 在派生类中调用基类构造函数。

    复制代码
    // keywords_base2.cs
    using System;
    public class BaseClass
    {
        int num;
        public BaseClass()
        {
            Console.WriteLine("in BaseClass()");
        }
        public BaseClass(int i)
        {
            num = i;
            Console.WriteLine("in BaseClass(int {0})", num);
        }
    }
    public class DerivedClass : BaseClass
    {
        // 该构造器调用  BaseClass.BaseClass()
        public DerivedClass()
            : base()
        {
        }
        // 该构造器调用 BaseClass.BaseClass(int i)
        public DerivedClass(int i)
            : base(i)
        {
        }
        static void Main()
        {
            DerivedClass dc = new DerivedClass();
            DerivedClass dc1 = new DerivedClass(1)();
            Console.ReadLine();
        }
    }
    复制代码
    注意:
    从静态方法中使用 base 关键字是错误的。
    base 主要用于面向对象开发的对态这方面,在示例2中有体现。
     
    关于this
    this 关键字引用类的当前实例。
    以下是 this 的常用用途:
    限定被相似的名称隐藏的成员
    将对象作为参数传递到其他方法
    声明索引器

    示例:

     

    复制代码
    // this 关键字
    // keywords_this.cs
    using System;
    class Employee
    {
        private string _name;
        private int _age;
        private string[] _arr = new string[5];
        public Employee(string name, int age)
        {
            // 使用this限定字段,name与age
            this._name = name;
            this._age = age;
        }
        public string Name
        {
            get { return this._name; }
        }
        public int Age
        {
            get { return this._age; }
        }
        // 打印雇员资料
        public void PrintEmployee()
        {
            // 将Employee对象作为参数传递到DoPrint方法
            Print.DoPrint(this);
        }
        // 声明索引器
        public string this[int param]
        {
            get { return _arr[param]; }
            set { _arr[param] = value; }
        }
    }
    class Print
    {
        public static void DoPrint(Employee e)
        {
            Console.WriteLine("Name: {0}
    Age: {1}", e.Name, e.Age);
        }
    }
    class TestApp
    {
        static void Main()
        {
            Employee E = new Employee("Hunts", 21);
            E[0] = "Scott";
            E[1] = "Leigh";
            E[4] = "Kiwis";
            E.PrintEmployee();
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("Friends Name: {0}", E[i]);
            }
            Console.ReadLine();
        }
    }
    复制代码
     
     
     
     
    #1楼 2017-08-27 15:56 cyanmsg  
    例2.1 仅仅会输出 "Build B"
    http://pic.cnblogs.com/face/1193530/20181227150419.png
    #2楼40995942018/10/26 22:16:15 2018-10-26 22:16 安迪巴  
    第一个哪怕不加:base()也会两个都输出的好吗
    实例化子类对像时,本身就会先调用父类默认构造函数,在调用子类构造函数
  • 相关阅读:
    Hbase安装
    Spring bean和Java Bean的区别
    PyTorch初始教程1入门教程
    GeoMesa教程索引
    Applied Spatial and Spatiotemporal Analysis(应用空间和时空分析)Applied Spatiotemporal Data Mining时空数据挖掘
    分布式存储和分布式计算
    geospark geotrellis geomesa geowave的异同
    halconsort_contours_xld xid轮廓进行排序
    平衡树:为什么Redis内部实现用跳跃表
    TypeScript里string和String,真不是仅仅是大小写的区别
  • 原文地址:https://www.cnblogs.com/ruingking/p/10411876.html
Copyright © 2020-2023  润新知