在.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。

时间: 2025-01-05 12:20:23

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

第04章 程序设计中的流程控制

/**第四章 程序设计中的流程控制 @选择语句 形式一:if(条件表达式) 单条语句; 形式二:if(条件表达式){ 语句体;} 形式三:if(条件表达式){ 语句体;}else{ 语句体;} 形式四:if(条件表达式){ 语句体;}else if{ 语句体;} 形式五:if(条件表达式){ 语句体;}else if{ 语句体;}else{ 语句体;}=========================================================================

树结构在程序设计中的运用

                                                                                引言 近年来,由于各种竞赛纷纷采用free-pascal,因此对于算法来说,空间效率上的要求降低了,而对时间效率却提出了更高的要求.这使得选手不仅要娴熟地掌握常规算法,而且要大胆创新,构造更高效的算法来解决问题. 在以往的程序设计中,链式结构采用得较多.的确链式结构有编程复杂度低.简单易懂等优点,但有一个致命的弱点:相邻的两个元素间的联系

PHP面向对象程序设计中的self、static、parent关键字用法分析

这篇文章主要介绍了PHP面向对象程序设计中的self.static.parent关键字用法,结合实例形式分析了self.static.parent关键字功能.应用场景及相关使用技巧,需要的朋友可以参考下,本文实例讲述了PHP面向对象程序设计中的self.static.parent关键字用法.分享给大家供大家参考,具体如下:看到php里面有关于后期静态绑定的内容,虽然没有完全看懂,但是也收获不少东西.不存在继承的时候,不存在继承的意思就是,就书写一个单独的类来使用的时候.self和static在范

漫谈Java程序设计中的接口应用

Java语言提供了一种接口(interface)机制.这种接口机制使Java的面向对象编程变得更加灵活.我们可以用接口来定义一个类的表现形式,但接口不能包含任何实现.在<Thinking in Java>一书中,作者对接口有这样的描述:“接口(interface)比抽象(abstract)的概念更进了一步.你可以把一个接口看成是一个纯的抽象类.”我认为作者对接口的这一解释再准确不过了. 理解并用好接口机制将帮助我们更好的掌握Java这种面向对象的编程语言.下面我们来讨论一下接口的使用规则以及相

php array_rand()函数从数组中随机选择一个或多个元素

php使用array_rand()函数从数组中随机选择一个或多个元素的方法. 使用array_rand() 函数从数组中随机选出一个或多个元素,并返回. array_rand(array,number) 参数 描述 array 必需.规定输入的数组参数. www.jbxue.com number 可选.默认是 1.规定返回多少个随机的元素. 例子: <?php $a=array("a"=>"Dog","b"=>"Cat

程序设计中的命名

[程序设计中的命名] 在设计过程中好的命名不一定但更大可能会带来好的设计,但是如果坏的命名那一定不会给你带来好的设计.在设计过程,如果你发现你很难命名某一个模块,某个方法时,可能你真正遇到的问题不是难命名的问题,而是这个设计是否真的合理,你或许应该花更多的时间来重新设计一下你的模块. 1.名字应该尽量采用名词 Bad:           Happy Good:          Happiness 2.不要使用类似名字空间的前缀 Bad:           SystemOnlineMessa

STL中慎重选择删除元素的方法

 一.要删除容器中有特定值的所有对象 1.如果容器是vector.string或deque,则使用erase-remove习惯用法.例如: vector<int> c; c.erase(remove(c.begin(),c.end(),1963),c.end());//删除值是1963的元素 下面讲一下算法remove: template<classForwardIterator,class T> ForwardIteratorremove(ForwardIterator fi

[转]在C#程序设计中使用Win32类库

http://blog.163.com/j_yd168/blog/static/496797282008611326218/ C# 用户经常提出两个问题:"我为什么要另外编写代码来使用内置于 Windows 中的功能?在框架中为什么没有相应的内容可以为我完成这一任务?"当框架小组构建他们的 .NET 部分时,他们评估了为使 .NET 程序员可以使用 Win32 而需要完成的工作,结果发现 Win32 API 集非常庞大.他们没有足够的资源为所有 Win32 API 编写托管接口.加以测

程序设计中的一些感悟

这篇感悟写的不错,特此转贴 1)学习应该从基础打起,不要一开始就尝试最高深的技术. 2)每看一本书,不要说这章我以前学习过了,也掌握的很好,因此我可以跳过这一章看更重要的了. 3)对于作业,遇到不会的尽量不要立刻向别人请教.如果实在解决不了的问题,可以先完成你会的,然后把一些特别的难点提炼出来,向高手请教. 3)不要指望书本和行家能帮你解决一切问题,因为并不是所有问题都能由别人教给你. 4)向别人请教问题应该把问题说明白.对于错误提示信息应该原样提供出来,不要按自己理解的信息提供.因为既然你自己