C#接口和抽象类的经典示例与比对

C#接口和抽象类绝对经典示例

.NET Framework是学习的最好资源,有意识的研究FCL是每个.NET程序员的必修课,关于接口和抽象类在FCL中的使用,我有以下的建议:

FCL对集合类使用了基于接口的设计,所以请关注System.Collections中关于接口的设计实现;

FCL对数据流相关类使用了基于抽象类的设计,所以请关注System.IO.Stream类的抽象类设计机制。

C#接口和抽象类Animal示例

下面的实例,因为是我的理解,因此给经典打上“相对”的记号,至于什么时候晋升为“绝对”,就看我在.NET追求的路上,是否能够一如既往的如此执着,因此我将把相对重构到绝对为止(呵呵)。 本示例没有阐述抽象类和接口在设计模式中的应用,因为那将是另一篇有讨论价值的文本,本文着眼与概念和原则的把握,但是真正的应用来自于具体的需求规范。

设计结构如图所示:

1. 定义抽象类

 
 
 
 
  1. public abstract class Animal 
  2. protected string _name; 
  3. //声明抽象属性 
  4. public abstract string Name 
  5. get
  6. //声明抽象方法 
  7. public abstract void Show(); 
  8. //实现一般方法 
  9. public void MakeVoice() 
  10. Console.WriteLine("All animals can make voice!"); 
  11.  

2. 定义接口

 
 
 
 
  1. public interface IAction 
  2. //定义公共方法标签 
  3. void Move(); 

3. 实现抽象类和接口

 
 
 
 
  1. public class Duck : Animal, IAction 
  2. public Duck(string name) 
  3. _name = name; 
  4. //重载抽象方法 
  5. public override void Show() 
  6. Console.WriteLine(_name + " is showing for you."); 
  7. //重载抽象属性 
  8. public override string Name 
  9. get { return _name;} 
  10. //实现接口方法 
  11. public void Move() 
  12. Console.WriteLine("Duck also can swim."); 
  13. public class Dog : Animal, IAction 
  14. public Dog(string name) 
  15. _name = name; 
  16. public override void Show() 
  17. Console.WriteLine(_name + " is showing for you."); 
  18. public override string Name 
  19. get { return _name; } 
  20. public void Move() 
  21. Console.WriteLine(_name + " also can run."); 

4. 客户端实现

 
 
 
 
  1. public class TestAnmial 
  2. public static void Main(string [] args) 
  3. Animal duck = new Duck("Duck"); 
  4. duck.MakeVoice(); 
  5. duck.Show(); 
  6. Animal dog = new Dog("Dog"); 
  7. dog.MakeVoice(); 
  8. dog.Show(); 
  9. IAction dogAction = new Dog("A big dog"); 
  10. dogAction.Move(); 

dunai认为:抽象类是提取具体类的公因式,而接口是为了将一些不相关的类“杂凑”成一个共同的群体。至于他们在各个语言中的句法,语言细节并不是我关心的重点。

Artech认为:所代码共用和可扩展性考虑,尽量使用Abstract Class。当然接口在其他方面的优势,我认为也不可忽视。

shenfx认为:当在差异较大的对象间寻求功能上的共性时,使用接口;当在共性较多的对象间寻求功能上的差异时,使用抽象基类。

最后,有关C#接口和抽象类的学习,MSDN的建议:

如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单易行的方法来控制组件版本。通过更新基类,所有继承类都随更改自动更新。另一方面,接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。

如果创建的功能将在大范围的全异对象间使用,则使用接口。抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。

如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元,则使用抽象类。

如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。抽象类允许部分实现类,而接口不包含任何成员的实现。

标题名称:C#接口和抽象类的经典示例与比对
标题路径:http://www.csdahua.cn/qtweb/news9/449059.html

网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网