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();
    }
}
/**/
/*
控制台输出:
The BaseClass Name is BaseClass
This DerivedClass is DerivedClass
*/

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();
    }
}
/**//*
控制台输出:
in BaseClass()
in BaseClass(1)
*/
 
注意:
从静态方法中使用 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}\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
*/
### C# 中 `base` 关键字用法 在 C# 中,`base` 关键字用于派生类访问其基类的方法、属性或构造函数。当一个方法被标记为 `virtual` 并在派生类中通过 `override` 进行覆盖时,可以通过 `base` 调用基类中的实现[^1]。 以下是具体示例: ```csharp public class BaseClass { public virtual void Write() { Console.WriteLine("Base Class Method"); } } public class DerivedClass : BaseClass { public override void Write() { base.Write(); // 调用基类的 Write 方法 Console.WriteLine("Derived Class Method"); } } ``` 在这个例子中,`DerivedClass` 的 `Write` 方法会先调用基类的同名方法再执行自己的逻辑。 --- ### 单继承的限制及其原因解释 #### **C#** C# 支持单继承,这意味着一个类只能直接继承自另一个单一的类。这种设计的主要原因是避免多重继承带来的复杂性和潜在冲突问题(如菱形继承问题)。然而,为了弥补这一限制,C# 提供了接口(interface)机制来支持多态行为[^2]。 如果尝试让一个类继承多个类,则会导致编译错误。例如: ```csharp class A {} class B {} // 错误:无法从两个类继承 class C : A, B {} ``` 上述代码会产生语法错误,因为 C# 不允许多重继承。 #### **Java** 与 C# 类似,Java 同样只支持单继承而不允许多重继承。这是为了避免复杂的继承结构可能导致二义性问题。不过,在 Java 中可以使用接口和抽象类作为替代方案来实现类似功能。 下面是一个简单的例子展示如何定义并扩展单个父类: ```java class Parent { public void display() { System.out.println("Parent method."); } } class Child extends Parent { @Override public void display() { super.display(); // 使用super调用父类方法 (类似于C#里的base) System.out.println("Child method."); } } ``` 在这里,“super”关键字的作用相当于 C# 中 “base”的作用,即用来引用当前对象所在的超类实例成员[^3]。 --- ### 对比总结 无论是 C# 还是 Java 都采取了单继承策略以简化语言模型并减少开发过程中可能出现的问题。尽管如此,两者都提供了其他工具比如接口或者密封/最终类的概念以便开发者能够构建更加灵活的应用程序架构。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值