深入剖析C#继承机制3

继承

三. 访问与隐藏基类成员

  (1) 访问基类成员

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

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

  示例:下面程序中基类 Person 和派生类 Employee 都有一个名为 Getinfo 的方法。通过使用 base 关键字,可以从派生类中调用基类上的 Getinfo 方法。

using System ;
public class Person
{
protected string ssn = "111-222-333-444" ;
protected string name = "张三" ;
public virtual void GetInfo() {
Console.WriteLine("姓名: {0}", name) ;
Console.WriteLine("编号: {0}", ssn) ;
}
}
class Employee: Person
{
public string id = "ABC567EFG23267" ;
public override void GetInfo() {
// 调用基类的GetInfo方法:
base.GetInfo();
Console.WriteLine("成员ID: {0}", id) ;
}
}
class TestClass {
public static void Main() {
Employee E = new Employee() ;
E.GetInfo() ;
}
}

  程序运行输出:

   姓名: 张三
   编号: 111-222-333-444
   成员ID: ABC567EFG23267
   示例:派生类同基类进行通信。

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")
{ Console.WriteLine("Child Constructor.") ; }
public void print( ) {
base.print( ) ;
Console.WriteLine("I'm a Child Class.") ;
}
public static void Main( ) {
Child child = new Child( ) ;
child.print( ) ;
((Parent)child).print( ) ;
}
}

  程序运行输出:

From Derived
Child Constructor.
I'm a Parent Class.
I'm a Child Class.
I'm a Parent Class.

  说明:

  1.派生类在初始化的过程中可以同基类进行通信。

  上面代码演示了在子类的构造函数定义中是如何实现同基类通信的。分号":"和关键字base用来调用带有相应参数的基类的构造函数。输出结果中,第一行表明:基类的构造函数最先被调用,其实在参数是字符串"From Derived"。

  2.有时,对于基类已有定义的方法,打算重新定义自己的实现。

  Child类可以自己重新定义print( )方法的实现。Child的print( )方法覆盖了Parent中的 print 方法。结果是:除非经过特别指明,Parent类中的print方法不会被调用。

  3.在Child类的 print( ) 方法中,我们特别指明:调用的是Parent类中的 print( ) 方法。

  方法名前面为"base",一旦使用"base"关键字之后,你就可以访问基类的具有公有或者保护权限的成员。 Child类中的print( )方法的执行结果出现上面的第三行和第四行。

  4.访问基类成员的另外一种方法是:通过显式类型转换。

  在Child类的Main( )方法中的最后一条语句就是这么做的。记住:派生类是其基类的特例。这个事实告诉我们:可以在派生类中进行数据类型的转换,使其成为基类的一个实例。上面代码的最后一行实际上执行了Parent类中的 print( )方法。

时间: 2024-10-27 05:32:12

深入剖析C#继承机制3的相关文章

深入剖析C#继承机制(1)

继承 内容导航 一.继承基础知识 二.C#的继承规则 三. 访问与隐藏基类成员 四.多级继承 五.继承与访问修饰符 一. 继承基础知识 为了提高软件模块的可复用性和可扩充性,以便提高软件的开发效率,我们总是希望能够利用前人或自己以前的开发成果,同时又希望在自己的开发过程中能够有足够的灵活性,不拘泥于复用的模块.C#这种完全面向对象的程序设计语言提供了两个重要的特性--继承性inheritance 和多态性polymorphism. 继承是面向对象程序设计的主要特征之一,它可以让您重用代码,可以节

深入剖析C#继承机制(2)

继承 四.多级继承 一些面向对象语言允许一个类从多个基类中继承,而另一些面向对象语言只允许从一个类继承,但可以随意从几个接口或纯抽象类中继承. 只有C++支持多级继承,许多程序员对此褒贬不一.多级继承常会引起继承来的类之间的混乱,继承而来的方法往往没有唯一性,所以C#中类的继承只可以是一个,即子类只能派生于一个父类,而有时你必须继承多个类的特性,为了实现多重继承必须使用接口技术,下面是对接口的多重继承进行介绍: using System ;//定义一个描述点的接口interface IPoint

深入剖析C#继承机制6

继承 五.继承与访问修饰符 访问修饰符是一些关键字,用于指定声明的成员或类型的可访问性.类的继承中有四个访问修饰符: public protected internal private.使用这些访问修饰符可指定下列五个可访问性级别: public protected internal internal protected private. 声明的可访问性 意义 public 访问不受限制. protected 访问仅限于包含类或从包含类派生的类型. internal 访问仅限于当前项目. pro

深入剖析C#继承机制7

继承 3.继承中对使用可访问性级别的限制 声明类型时,最重要的是查看该类型是否必须"至少"与其他成员或类型"具有同样的可访问性".例如,直接基类必须至少与派生类具有同样的可访问性.以下声明将导致编译器错误,因为基类 BaseClass 的可访问性小于 MyClass: class BaseClass {...}public class MyClass: BaseClass {...} // Error 下表汇总了对使用声明的可访问性级别的限制. 上下文 备注 类 类

深入剖析C#继承机制1

继承 一. 继承基础知识 为了提高软件模块的可复用性和可扩充性,以便提高软件的开发效率,我们总是希望能够利用前人或自己以前的开发成果,同时又希望在自己的开发过程中能够有足够的灵活性,不拘泥于复用的模块.C#这种完全面向对象的程序设计语言提供了两个重要的特性--继承性inheritance 和多态性polymorphism. 继承是面向对象程序设计的主要特征之一,它可以让您重用代码,可以节省程序设计的时间.继承就是在类之间建立一种相交关系,使得新定义的派生类的实例可以继承已有的基类的特征和能力,而

深入剖析C#继承机制2

继承 二.C#中的继承符合下列规则: 1.继承是可传递的.如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同样也继承了A中的成员.Object 类作为所有类的基类. 2.派生类应当是对基类的扩展.派生类可以添加新的成员,但不能除去已经继承的成员的定义. 3.构造函数和析构函数不能被继承.除此以外的其它成员,不论对它们定义了怎样的访问方式,都能被继承.基类中成员的访问方式只能决定派生类能否访问它们. 4.派生类如果定义了与继承而来的成员同名的新成员,就可以覆盖已继承的成员.但这并

深入剖析C#继承机制5

继承 四.多级继承 一些面向对象语言允许一个类从多个基类中继承,而另一些面向对象语言只允许从一个类继承,但可以随意从几个接口或纯抽象类中继承. 只有C++支持多级继承,许多程序员对此褒贬不一.多级继承常会引起继承来的类之间的混乱,继承而来的方法往往没有唯一性,所以C#中类的继承只可以是一个,即子类只能派生于一个父类,而有时你必须继承多个类的特性,为了实现多重继承必须使用接口技术,下面是对接口的多重继承进行介绍: using System ;//定义一个描述点的接口interface IPoint

深入剖析C#继承机制4

继承 2) 隐藏基类成员 想想看,如果所有的类都可以被继承,继承的滥用会带来什么后果?类的层次结构体系将变得十分庞,大类之间的关系杂乱无章,对类的理解和使用都会变得十分困难.有时候,我们并不希望自己编写的类被继承.另一些时候,有的类已经没有再被继承的必要.C#提出了一个密封类(sealed class)的概念,帮助开发人员来解决这一问题. 密封类在声明中使用sealed 修饰符,这样就可以防止该类被其它类继承.如果试图将一个密封类作为其它类的基类,C#将提示出错.理所当然,密封类不能同时又是抽象

JavaScript学习:基础继承机制

javascript|继承 最近因为学校做网站设计,所以一直在ASP上和数据库上大费苦心. 我在前一个阶段是做Java程序设计的.突然接到任务并学习ASP,所以我一直都热忠并善于利用javascript来构架ASP程序. javascript的一个明显的优点就在于它可以定义和持有自己的对象.这一点好象是VBScript所无法比拟的. 有了这一点,可以利用javascript进行更接近于面向对象的程序设计.也许这将使网站开发更有乐趣... 但有个严重的缺点!javascript不支持继承机制.不象