关键字:

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。

最新文章

  1. 优化openfire服务器,达到单机20万,集群50万
  2. 大叔也说Xamarin~Android篇~调用远程API接口,发POST请求
  3. 在python中使用matplotlib中的Matplotlib-Animation “No MovieWriters Available”
  4. HDU 3065 病毒侵袭持续中(AC自动机)
  5. easyui tree 编辑后保留原先状态
  6. apple开发者账号申请
  7. Windows ftp 连不上Linux
  8. js模块化开发
  9. CSS3 Media Queries 详细介绍与使用方法
  10. Python内置函数(17)——chr
  11. (八十一)利用系统自带App来实现导航
  12. 什么是kibana?
  13. Java 面试基础总结(一)
  14. css3的calc()
  15. 服务网关zuul之二:过滤器--请求过滤执行过程(源码分析)
  16. [转]autoid文件上传
  17. Active Directory PowerShell模块收集AD信息
  18. Ubuntu下手动安装Nvidia显卡驱动
  19. Javascript中对数组处理的函数汇总
  20. POJ_2492 A Bug's Life 【并查集】

热门文章

  1. 用Windbg来看看CLR的JIT是什么时候发生的
  2. 【剑指Offer学习】【面试题19 :二叉树的镜像】
  3. [React] React Fundamentals: Using Refs to Access Components
  4. List IEnumerable
  5. BigInteger和BigDecimal大数相加问题
  6. 异步任务(AsyncTask)
  7. JavaScript入门(5)
  8. 初学Android:意图之intent
  9. SqlServer Change Data Capture(CDC)数据变更捕获
  10. mark jquery 链式调用的js原理