|
|
最简单的继承就是一个类型定义了一个方法,它的子类又重新定义了该方法。见下面的例子:2 j4 N7 _: f6 g, D) E
: Z2 ?* h( y: B class BaseClass {
8 W" j1 |4 O7 O' y public void SimpleMethod() {+ O' K( G6 X8 c) q! } K
DebugMgr.start( 10, "BaseClass.SimpleMethod");
$ S% E+ G/ g# L' a, g" o' k! t DebugMgr.end( 10);
& C$ j" l5 j7 t0 o9 V+ a class Subclassed : BaseClass {5 p% M- ?+ | ~& U9 }
public new void SimpleMethod() {
( e" z3 q) U( {0 s9 i6 t8 Z3 `3 w DebugMgr.start( 10, "Subclassed.SimpleMethod"); DebugMgr.end( 10);
2 ~ ]- I5 j' b2 W, |1 M, k
% `8 m9 U3 A* m0 n3 _& m BaseClass类定义了S彳mpleMethod方法,Subclassed类是BaseClass类的子类,它重新定义了SimpleMethod方法。注意关键字new的使用,正是关键字new使C#和其他.NET语言成为具有一致继承管理能力的软件开发语言。* f7 O2 D+ M# \! |' ?1 x( g& u+ H
$ e; T; A+ E2 n( m
当一个类继承自另一个类,并定义了一个和父类中相同的方法后,这个类就覆盖(over-ride) 了这个方法。覆盖意味着用一个新的功能来代替旧的功能。新功能的代码可能会引入新的问题。要避免这样的问题,C#和.NET要求开发人员在覆盖一个方法时给出明确的说明。以此提醒开发人员该功能在基类中有不同的实现。4 @* Q \! @9 K7 Y" {" ^+ ] R7 r
: f3 F, d4 f$ K3 Q+ ^! g 下面的代码说明如何使用定义的类型:
4 W. ?1 ~5 t5 V+ i7 _0 t1 v/ D6 d) d: X" | z
Subclassed subcls = new Subclassed(); subcls.SimpleMethod();
, h- b) @* j: u8 ]1 @ DebugMgr.output( 10, "Now assigning to type BaseClass");
2 I& M. N. P V BaseClass basecls = subcls; basecls.SimpleMethod();
( }' {. L, t8 W8 P9 G( N: N$ P& b( j6 E/ N$ k
Subclassed类型被实例化,并被赋值给同样声明为Subclassed类型的变量subcls。接下来,调用SecondMethod方法,然后将实例向上转型为父类BaseClass类型,并赋值给basecls变量,并再一次调用了 S1mpleMethod方法。下面是这个示例代码执行后产生的输出信息:) V, r* k6 o' z- w5 m
5 ~- s6 U9 o$ F* h$ k start (Subclassed.SimpleMethod) end (Subclassed.SimpleMethod) Now assigning to type BaseClass start (BaseClass.SimpleMethod) end (BaseClass.SimpleMethod)
Q) y, g' e" W) \" {/ u
0 J X! [+ t7 T8 {( @ 当使用了关键字new,使用者使用的功能要取决于类型和类型转换。假设实例化了BaseClass类型,如果该实例向下转型为Subclassed,则会调用Subclassed的方法,因为Subclassed拥有SecondMethod方法的实现。如果将实例的类型转换回BaseClass,由于BaseClass自己也实现SecondMethod方法,所以将会调用BaseClass的方法。这是个很清晰的继承模型,因为所执行的方法的实现都是基于类型的转换。! K7 _- G% u3 g$ n
|
|