小鱼儿-fly

c#,ASP.NET 一条艰辛而漫长的道路...千里之行,始于足下!

导航

C# 继承

Posted on 2010-10-28 11:06  小鱼儿-fly  阅读(3225)  评论(0编辑  收藏  举报

在面向对象中,有两种不同的继承类型:实现继承和接口继承。

1. 实现继承:表示一类型派生于一个基类型,拥有该基类型的所有成员字段和函数。在实现继承中,派生类型的每个函数蚕蛹基类型的实现代码,除非在派生类型的定义中指定重写该函数的实现代码。在需要给现有的类型添加功能,或许多相关的类型共享一组重要的公共功能时,这种类型的继承是备尝有效地。

a.声明:如果类也派生与接口,则用逗号分隔开基类和接口。

 class A:B,Imyinterface

{

  //实现代码

}

b.虚方法:把一个基类函数声明为virtual,该函数就可以在派生类中重写了。也可把属性声明为virtual,但是要在定义上加virtual.

private string foreName;

public virtual string ForeName

{

  get{return foreName};

  set{foreName = value};

}

在c#中,函数在默认情况下不是虚拟的,但除了构造函数以外可以显示声明为virtual。在派生类的函数重写另一个函数时,要使用override关键字显式声明。

成员字段和静态函数都不能声明为virtual,因为这个概念只对类中的实例函数成员有意义。

 

c.隐藏方法

若签名相同的方法在基类和派生类中都进行了声明,但该方法没有声明为virtual和override,派生类方法就会隐藏基类方法。

使用new 关键字声明我们要隐藏基类一个方法

 

d.调用函数的基类版本: base.<MethodName>()

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

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

 

e.派生类的构造函数

派生类会有某些特殊问题的原因:在创建派生类的实例时,实际上有多个构造函数起作用。要实例化的类的构造函数本身不能初始化类,还必须调用基类中的构造函数。

构造函数的调用顺序是先调用System.Object,再按照层次结构由上而下进行,直到到达编译器要实例化的类为止。基类的构造函数总是最先调用,也就是说派生类的构造函数可以在执行过程中调用它可以访问的基类方法,属性和其他成员。因为基类已经构造出来,其字段也初始化了。

 

2.接口继承:表示一个类型只继承了函数的签名,没有继承任何实现代码。在需要指定该类型具有某些可用的特性时,最好使用这种类型的继承。接口继承常被看做提供了一种契约:让类型派生于接口,来保证为客户提供某个功能。

 

注:结构和类的区别:

  • 结构总是派生于System.ValueType,它们还可以派生于任意多个接口。
  • 类总是派生于用户选择的另一个类,它们还可以派生于任意多个接口。

3. 继承与访问修饰符

  访问修饰符是一些关键字,用于指定声明的成员或类型的可访问性。类的继承中有四个访问修饰符: public protected internal private。使用这些访问修饰符可指定下列五个可访问性级别: public protected internal internal protected private。

public 访问不受限制。
protected 访问仅限于包含类或从包含类派生的类型。
internal 访问仅限于当前项目。
protected internal 访问仅限于从包含类派生的当前项目或类型。

 

4. 继承中关于属性的一些问题

  和类的成员方法一样,我们也可以定义属性的重载、虚属性、抽象属性以及密封属性的概念。与类和方法一样,属性的修饰也应符合下列规则:

  属性的重载

  • 在派生类中使用修饰符的属性,表示对基类中的同名属性进行重载。
  • 在重载的声明中,属性的名称、类型、访问修饰符都应该与基类中被继承的属性一致。
  • 如果基类的属性只有一个属性访问器,重载后的属性也应只有一个。但如果基类的属性同时包含get 和set 属性访问器,重载后的属性可以只有一个,也可以同时有两个属性访问器。

  注意:与方法重载不同的是,属性的重载声明实际上并没有声明新的属性,而只是为已有的虚属性提供访问器的具体实现。

  虚属性

  • 使用virtual 修饰符声明的属性为虚属性。
  • 虚属性的访问器包括get 访问器和set 访问器,同样也是虚的。

  抽象属性

  • 使用abstract 修饰符声明的属性为抽象属性。
  • 抽象属性的访问器也是虚的,而且没有提供访问器的具体实现。这就要求在非虚的派生类中,由派生类自己通过重载属性来提供对访问器的具体实现。
  • abstract 和override 修饰符的同时使用,不但表示属性是抽象的,。而且它重载了基类中的虚属性这时属性的访问器也是抽象的。
  • 抽象属性只允许在抽象类中声明。
  • 除了同时使用abstract 和override 修饰符这种情况之外,static, virtual, override和abstract 修饰符中任意两个不能再同时出现。

  密封属性

  • 使用sealed 修饰符声明的属性为密封属性。类的密封属性不允许在派生类中被继承。密封属性的访问器同样也是密封的。
  • 属性声明时如果有sealed 修饰符,同时也必须要有override 修饰符。

4.要注意的几点

  • 派生类只能从一个类中继承
  • 派生类从它的直接基类中继承成员:方法,域,属性、事件、所引器。除了构造函数和析构函数,派生类隐式地继承了直接基类的所有成员。
  • 继承是可传递的。如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同样也继承了A中的成员。Object 类作为所有类的基类。
  • 派生类应当是对基类的扩展。派生类可以添加新的成员,但不能除去已经继承的成员的定义。
  • 派生类如果定义了与继承而来的成员同名的新成员,就可以覆盖已继承的成员。但这并不因为这派生类删除了这些成员,只是不能再访问这些成员。
  • 类可以定义虚方法、虚属性以及虚索引指示器,它的派生类能够重载这些成员,从而实现类可以展示出多态性。

  

参考:http://www.yesky.com/126/1717126_6.shtml