在.NET 应用程序设计中如何选择Class, Abstract Class and Interface

关键字:

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中是默认的。举例如下:

 1 //Abstarct Class
 2 public abstract class Vehicles 
 3       {
 4         private int noOfWheel;
 5         private string color;
 6         public abstract string Engine
 7         {   
 8             get;
 9             set;
10         }
11         public abstract void Accelerator();
12       }
13 
14       //Interface 
15 public interface Vehicles 
16       {
17         string Engine
18         {   
19             get;
20             set;
21         }
22         void Accelerator();
23       }

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

 

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

 1 public interface Vehicles 
 2       {
 3  4         //新添加的方法
 5         void Brake();
 6       }
 7 要修复这个错误,我们不得不在类Car和Train中实现方法Brake(). 示范代码如下:
 8 public class Car : Vehicles
 9 {
10 11         public void Brake()
12         {
13             System.Console.WriteLine("Stop your car”);
14         }
15 } 
16 
17 public class Train : Vehicles
18 {
19 20         public void Brake()
21         {
22             System.Console.WriteLine("Stop your train”);
23         }
24 }

如果我们使用抽象类或正常类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。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。