.NET中Class,Abstract and Interfa选择

日期: 2008-06-11 作者:Jim O'Reily 来源:TechTarget中国

  关键字:


  Type– 类型
  Class - 类
  Abstract - 抽象的
  Interface - 接口
  Member - 成员
  Method - 方法
  Property - 属性


  预备知识:在阅读本文时,您应当了解.NET编程的基本知识并且已经掌握Class, Abstract Class 和Interface全部知识。这里我仅简单介绍一下他们的基本知识。本文的例子由C#编写。期望您对C#编程有一定的了解。


  正文:


  我们无法创建一个Abstract Class或Interface的实例(INSTANCE)。让我们从Abstract Class和Interface的定义来看他们的不同。Abstract Class可以包含Abstract Methods和Abstract Properties, 也可以包含其他的Members,象正常的Class一样。而Interface只能包含Abstract Methods和Properties(属性)。Interface中的所有Methods和Properties不需要加Abstract和Public关键字,因为这两个关键字在Interface中是默认的。举例如下:


  //Abstarct Class
  public abstract class Vehicles
  {
   private int noOfWheel;
   private string color;
   public abstract string Engine
   {
    get;
    set;
   }
   public abstract void Accelerator();
  }
  //Interface
  public interface Vehicles
  {
   string Engine
   {
    get;
    set;
   }
   void Accelerator();
  }


  通常来讲,在设计时优先考虑使用Class或Abstract Class而不是Interface。Interface的主要缺点是灵活性比较差。一旦你定义好了Interface,那么它的Members就固定了。如果你要对已经发布的程序添加新的Method,就会破坏你已经的实现该接口的Type(Class,Struct等)。因为你必须在你已有的Type中实现新的方法,否则你的程序将无法通过编译。


  例如类Car和Train实现了接口Vehicles. 现在我们要给接口Vehicles再加一个方法Brake(). 如果我们现在编译类Car和Train,编译器将报错。


  public interface Vehicles
  {
   …
   //新添加的方法
   void Brake();
  }


 要修复这个错误,我们不得不在类Car和Train中实现方法Brake(). 示范代码如下:


  public class Car : Vehicles
  {
   …
   public void Brake()
   {
    System.Console.WriteLine(“Stop your car”);
   }
  }
  public class Train : Vehicles
  {
   …
   public void Brake()
   {
    System.Console.WriteLine(“Stop your train”);
   }
  }


  如果我们使用抽象类或正常类Vehicles,我们仅仅需要在类Vehicles中添加Brake()方法并且实现这个方法。然后我们根据具体需要来决定是否要覆盖类Car 或Train中的Brake()方法。


  public abstract class Vehicles
  {
   …
   //新添加的方法,无需在它的子类中覆盖这个方法。
   public void Brake()
   {
    System.Console.WriteLine(“Stop your vehicles”);
   }
  }


  Class则可以提供更好的灵活性。你可以给Class添加任何Members,只要添加的不是Abstract Method即可(也就是说你要提供一个有具体实现的方法)。这样就不会影响从该Class继承的类,已有代码无需做任何改变。


  设计原则


  优先考虑使用Class或Abstract Class而不是Interface。


  使用Abstract Class代替Interface来降低Class继承层次之间的耦合关系。


  使用Interface,如果你需要给一个值类型实现(Value Type, 象STRUCT就是值类型)多态继承(Polymorphic Hierarchy)。(值类型除了从Interface继承以外,不能从其他Type继承)。


  在需要多重继承的情况下,可以考虑使用Interface。


  参考目录:Microsoft .NET Development Series, Framework Design Guidelines

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐