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

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

    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 、抽象类可以提供某个方法的默认实现,而接口则不可以。在这种情况下,抽象类更多的是作为一个模板方法模式类,它声明一些必须的接口,从而将一些算法的变化延迟到派生类中。 因此,如果希望某个方法具有默认实现或者使用模板方法模式时,请使用抽象类。 如:
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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值