【转】C#中base关键字的几种用法:base()

转:https://blog.csdn.net/cplvfx/article/details/82982862

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

运行结果:

Build A

Build B

2.2关于base在派生类中调用基类的方法。

    public class A
    {
        public virtual void Hello()
        {
            Console.WriteLine("Hello");
        }
    }
    public class B : A
    {
        public override void Hello()
        {
            base.Hello();//调用基类的方法,显示Hello
            Console.WriteLine("World");
        }
    }

运行结果:

Hello

World

下面是我自己改进了一下上面的例子:

    public class A
    {
        public virtual void Hello()
        {
            Console.WriteLine("Hello");
        }
    }
    public class B : A
    {
        public static void Main ()
        {
            B b = new B();
            b.Hello2();
            b.Hello();
        }

        public override void  Hello()
        {
            base.Hello();//调用基类的方法,显示Hello
            Console.WriteLine("World");
        }
        public void Hello2()
        {
            base.Hello();//调用基类的方法,显示Hello
        }
    }

运行结果:

Hello

Hello

World

关于Base:

base 关键字用于从派生类中访问基类的成员:
调用基类上已被其他方法重写的方法。
指定创建派生类实例时应调用的基类构造函数。
基类访问只能在构造函数、实例方法或实例属性访问器中进行。

1. 在派生类中调用基类方法。

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._className);
        //调用基类方法
       base.PrintName();
        Console.WriteLine("This DerivedClass is {0}", _className);
    }
}
class TestApp
{
    public static void Main()
    {
        DerivedClass dc = new DerivedClass();
        dc.PrintName();
    }

}
}

运行结果:

The BaseClass Name is BaseClass

Class Name: BaseClass

This DerivedClass is DerivedClass

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

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

运行结果:

in BaseClass()
in BaseClass(int 1)

注意:
从静态方法中使用 base 关键字是错误的。
base 主要用于面向对象开发的对态这方面,在示例2中有体现。

-----------------------------------------------------------------------------我是一条帅气的分割线-------------------------------------------------------------帅气--------------------------------------------------------------------------------------------------------------的--------------------------------分------------割--------------线--------------------------

关于this

this 关键字引用类的当前实例。
以下是 this 的常用用途:
限定被相似的名称隐藏的成员
将对象作为参数传递到其他方法
声明索引器

    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}\nAge: {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();
        }
    }

运行结果:

Name: Hunts
Age: 21

Friends Name: Scott

Friends Name: Leigh

Friends Name: 

Friends Name: 

Friends Name: Kiwis

posted @ 2019-11-13 11:34  sgggr  阅读(5158)  评论(0编辑  收藏  举报