关键字:

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。

在.NET 应用程序设计中如何选择Class, Abstract Class and Interface的更多相关文章

  1. 薛非《品悟C-抛弃C程序设计中的谬误与恶习》读后感part1【转】

    薛非<品悟C-抛弃C程序设计中的谬误与恶习>读后感part1 作者:宝贝孙秀楠﹣大连程序员 发表于2012年10月5日由admin 出处:http://sunxiunan.com/?p=2 ...

  2. 《程序设计中的组合数学》——polya计数

    我们在高中的组合数学中常常会碰到有关涂色的问题,例如:用红蓝两种颜色给正方形的四个顶点涂色,会有几种不同的方案.在当时,我们下意识的认为,正方形的四个顶点是各不相同的,即正方形是固定的.而实际上我们知 ...

  3. 嵌入式实时程序设计中C/C++代码的优化

    1 引言 计算机技术和信息技术的高速发展的今天,计算机和计算机技术大量应用在人们的日常生活中,嵌入式计算机也得到了广泛的应用.嵌入式计算机是指完成一种或多种特定功能的计算机系统,是软硬件的紧密结合体. ...

  4. Visual Studio工具栏中无法选择调试设备

    Visual Studio工具栏中无法选择调试设备 在Visual Studio工具栏中,默认显示已经识别的设备.用户可以从中选择对应的设备,进行调试和部署App.但是由于误操作,可能导致该选项丢失. ...

  5. VIM 中鼠标选择不选中行号

    VIM 中鼠标选择不选中行号 在Vim中,我们一般会使用 :set nu 打开行号开关. 但是打开行号后,有个弊端,那就是在用鼠标进行选择的时候,会将前面的行号也一起进行拷贝了.但是在gVim中进行选 ...

  6. ArcGIS Engine中如何获取Map中已经选择的要素呢

    1.使用IEnumFeturea对象获取map中的FeatureSelection,该方法可以获取所有图层的选择要素.IMap中的FeatureSelection可不是IFeatureSelectio ...

  7. 如何在VBS脚本中显示“选择文件对话框”或“选择目录对话框”

    .选择文件[XP操作系统,不能用于Win2000或98],使用“UserAccounts.CommonDialog”对象向用户显示一个标准的“文件打开”对话框 Set objDialog = Crea ...

  8. python random从集合中随机选择元素

    1.使用python random模块的choice方法随机选择某个元素 from random import choice foo = ['a', 'b', 'c', 'd', 'e'] print ...

  9. Python中的选择排序

    选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大 ...

随机推荐

  1. IPAddress类

    using System.Net; IPAddress ad1=IPAddress.Parse("192.168.1.1"); //ip为192.168.1.1的地址 IPAddr ...

  2. post方法

    CookieContainer cookie = new CookieContainer(); private string HttpPost(string Url, string postDataS ...

  3. 问题-Fastreport4 Memo打印时中文显示不全

    问题现象:在使用Fastreport4制作打印工具时,发现Memo显示中文老是显不不全. 问题原因:可能是因为字符编码的原因,希望高人指点. 问题处理:将属性font-charset设置为DEFAUL ...

  4. (贪心5.1.1)POJ 1230 Pass-Muraille

    /* * POJ_1230.cpp * * Created on: 2013年10月9日 * Author: Administrator */ #include <iostream> #i ...

  5. 10个可以直接拿来用的JQuery代码片段

    jQuery里提供了许多创建交互式网站的方法,在开发Web项目时,开发人员应该好好利用jQuery代码,它们不仅能给网站带来各种动画.特效,还会提高网站的用户体验. 本文收集了10段非常实用的jQue ...

  6. 用HiveDB横向切分MySQL数据库

    HiveDB是一个用来横向切分mysql数据库的开源框架,构建一个高性能和可扩展的基于mysql的系统需要大量的系统设计经验和良好的代码的实现,一个比较好的策略是将你的数据横向切分在多个server上 ...

  7. cocos2d-x 2.0 拖尾效果分析

    转自:http://game.dapps.net/gamedev/game-engine/7281.html 在Cocos2d-x中,拖尾效果有一个专门的类CCMotionStreak来实现.下面我们 ...

  8. spring4使用websocket

    看到spring4的介绍上说已经支持websocket了,尝试了一下之后各种坑,不如servlet简单,写篇文章来讲解一下自己遇到的坑. 环境:tomcat8+spring4.1.6+jdk8+ngi ...

  9. 启动列表的activity

    每学一个知识点就要重新创建一个项目,感觉那样太繁琐了,特别是android studio开发,没创建一个项目都会重新打开一个窗口 所以我就在那想,何不有一个功能列表,点击每一个列表项的时候就跳转到那个 ...

  10. php连接oracle数据库(linux)(转)

    php连接访问Oracle是用过oci函数,以下是整理的文档 1.安装Apache和php包 yum install -y httpd php* 2.下载Oracle组件 oracle-instant ...