对先前用过 vb6.0而现在转到C#下编程的人在叹服C# 的灵活性的同时,往往设计在程序构架时感到无从下手。的确,C#不但具有如同VB那样的快速开发特性,同时也深深刻着C++的特征。可以这样说,对C++了解的越多,对用C#开发程序越有利。
在设计程序构架时,经常会在“到底是用interface 还是用 class 继承”上踌躇不决。仅仅从C#语言语法上看,class 不支持多重继承而 interface 却可以。同事们常常为此争辩,主张用 interface 的人引经据典以C#接口可多重继承这个语言特征为依据,大谈特谈使用 interface 的好处;主张使用 class 的人,这个时候往往会争辩到:“接口定义里不能有field,不能定义变量!”
其实,不必从理论上去争论这些。举个最简单的例子,也许能说明问题。
这个例子来自于 vb 6.0 的帮助(MSDN 2001)。例子的要求是这样的:开发一个系统模拟侏罗纪生物系统,这个生物系统中只有两个生物角色:恐龙和虱子。
设计这个生物模拟系统的大致思路有两条
第一条思路是利用继承:
1) 恐龙和虱子都是动物,所以首先设计一个抽象类 animal
public abstract class animal {
…
// 抽象方法Bite, 模拟动物“咬”行为
public abstract void Bite( animal o );
…
}
显然,将animal 类定义为abstract 是合理的,因为将animal实例化毫无意义。
2 ) 继承,定义恐龙和虱子对象
首先定义虱子对象 flee
public class flee: animal {
public int size; //虱子的个头
public int weight; //虱子的重量
public override void Bite( animal obj )
{
// 在这里实现虱子“咬”动作 —— 细细的吸管插入
// 被捕食者的肌肤后温柔地吸血。这里被捕食者即
// 为传入 参数 obj
}
}
接着定义恐龙对象 dinosaur
public class dinosaur: animal {
public int size; //恐龙的个头
public int weight; //恐龙的重量
public override void Bite( animal obj )
{
// 在这里实现恐龙“咬”动作 —— 撕咬时不时地
// 晃动着脑袋并发出低沉的嗥叫。这里被捕食者即
// 为传入 参数 obj
}
}
3)开始模拟侏罗纪生物系统
// 第一只恐龙 ano 诞生啦! ano 好生威风,但有些孤独!
dinosaur ano = new dinosaur( );
// 生成虱子家族 gigi(10只)
flee[10] gigi = new flee[10] {...};
// 战争开始,第一只虱子向恐龙ano发起进攻!
gigi[0].Bite( ano );
// 其余虱子跟进
for( int i=1; i<=9; i++ )
gigi[i].Bite( ano);
// 恐龙 ano 暴怒,开始反击!
ano.Bite( gigi[0] );
// 恐龙 ano 继续反击!
for( int i=1; i<10; i++ )
ano.Bite( gigi[i] );
……
呵呵,怎么样,这个生物系统挺热闹吧?
(先打住,太晚了,睡觉!让它们斗去吧!^_^ 待续 )