base 关键字(类)

通过base 关键字访问基类的成员:

        调用基类上已被其他方法重写的方法。

      指定创建派生类实例时应调用的基类构造函数。

      基类访问只能在构造函数、实例方法或实例属性访问器中进行。

      从静态方法中使用 base 关键字是错误的。

实例:

using System ;

 public class Parent

  {

 string parentString;

 public Parent( )

          { Console.WriteLine("Parent Constructor.") ; }  

public Parent(string myString)

         {parentString = myString;Console.WriteLine(parentString) ;}

public void print( )

           { Console.WriteLine("I'm a Parent Class.") ; }

}  

public class Child : Parent

{  

public Child( ) : base("From Derived") //类child中的构造函数,引用基类中的构造函数.

        { Console.WriteLine("Child Constructor.") ; }

public void print( )

        {base.print( ) ;Console.WriteLine("I'm a Child Class.") ;} 

public static void Main( )

        {  

         Child child = new Child( ) ;//在外部调用时(static)首先执行构造函数

          child.print( ) ;                    //执行child类中的方法print( )

         ((Parent)child).print( ) ;     //调用基类中的方法print( )

        }

 }

说明:

  1. 派生类在初始化的过程中可以同基类进行通信(通过构造函数)。
  2. Child类可以自己重新定义print( )方法的实现。Child的print( )方法覆盖了Parent中的 print 方法。结果是:除非经过特别指明,Parent类中的print方法不会被调用。
  3. 方法名前面为"base",一旦使用"base"关键字之后,你就可以访问基类的具有公有或者保护权限的成员。 Child类中的print( )方法的执行结果出现上面的第三行和第四行。
  4. 访问基类成员的另外一种方法是:通过显式类型转换。

      在Child类的Main( )方法中的最后一条语句就是这么做的。记住:派生类是其基类的特例。这个事实告诉我们:可以在派生类中进行数据类型的转换,使其成为基类的一个实例。上面代码的最后一行实际上执行了Parent类中的print( )方法。
     
### 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、付费专栏及课程。

余额充值