赛迪网 > IT技术 .Net专区 > 文章
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

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

发布时间:2008.02.02 10:50     来源:赛迪网    作者:Jim

本文面向的读者:.NET 应用程序设计师和程序员

关键字:

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

(责任编辑:徐培炎)


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· ATP class-6 microSDHC 4GB存储卡闪亮登场 (12-12) · 创见推出16GB超大容量SDHC Class 6存储卡 (11-14)
· 细化解析:如何动手修改interfaces文件 (09-09) · 威刚近日推出三款超大容量高速存储卡新品 (09-05)
· Abstract (05-01) · Java类加载内幕 (12-15)
· Interface (08-18) · 教您怎样简化Java应用程序的打包和发布 (12-09)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
· 首个网购消费指数诞生 淘宝10年赶超沃尔玛
· 中小企业需要怎样的信息化 IT企业六点浅见
· 访谈 西安协同的BPM和SOA战略 信息化监理
· 菏泽网通改造方案 海事数据交换平台方案
  IT博客 ·曾剑秋·项立刚·Java学习·网管
  IT技术论坛 ·开发·网管·安全·数据库·系统