现在的位置: 首页 > 综合 > 正文

用 interface 还是用 class ?

2012年08月10日 ⁄ 综合 ⁄ 共 1448字 ⁄ 字号 评论关闭

对先前用过 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] );

……

呵呵,怎么样,这个生物系统挺热闹吧?

(先打住,太晚了,睡觉!让它们斗去吧!^_^    待续 )

抱歉!评论已关闭.