C#接口和抽象类使用原则

王朝学院·作者佚名  2009-11-07  
宽屏版  字体: |||超大  

接口和抽象类都可以用生强制某个类型的实例具备指定的方法,所以在使用过程中我们很容易将他们混淆。下面是我自己总结的一些区别与使用原则,与大家分享,不正之处还请大虾们多多指正。

1、在C#中,接口只能声明方法或属性的原形,而不能包含常量或者其他声明(这与Java中是不同的),而在抽象类中则是可以的。 如:

interface ISimple {

void DoSomething();

}

是合法的,而

interface ISimple {

void DoSomething();

const float PI=3.1415927;

}

则是不合法的。抽象类中没有这个限制。如:

public abstract class SomeClass {

public abstract void DoSomething();

public float PI=3.1415927;

}

因此,当你需要不同的实现类中共享一些常量时,应使用抽象类代替接口。

2、接口只能用于声明公用规则,而不能用于声明保护性规则。如:

interface ITest {

void Test();

}

如果企图在ITest接口的实现类中将Test声明成protected,将会产生一个编译错误!如:

public class TestImpl {

protected void Test() { }

}

因此,当你需要在某个实现类中强制其实现某个方法,而该方法又不是公有的时,请使用抽象类代替接口。

3、抽象类可以提供某个方法的默认实现,而接口则不可以。在这种情况下,抽象类更多的是作为一个模板方法模式类,它声明一些必须的接口,从而将一些算法的变化延迟到派生类中。

因此,如果希望某个方法具有默认实现或者使用模板方法模式时,请使用抽象类。

如:

view plaincopy to clipboardprint?

public abstract class BusinessProcess {

public void DoBusiness(object context) {

if (OnCheckingPrivilege(context)) {

OnProcessingBusiness(context);

OnLoggingBusiness(context);

}

else {

throw new Exception("No Privileges!");

}

}

protected virtual bool OnCheckingPrivilege(object context) {

return false;

}

protected virtual OnLogginBusiness(object context) { }

protected abstract void OnProcessingBusiness(object context);

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有