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

开发 后端
学习C#接口和抽象类最好的方法莫过于研究范例。.NET框架是最好的学习资源,另外本文也提供了几个实例。

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

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

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

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

C#接口和抽象类Animal示例

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

设计结构如图所示:

设计结构图

1. 定义抽象类

public abstract class Animal   
{   
protected string _name;   
//声明抽象属性   
public abstract string Name   
{   
get;   
}   
 
//声明抽象方法   
 
public abstract void Show();   
 
//实现一般方法   
 
public void MakeVoice()   
{   
Console.WriteLine("All animals can make voice!");   
}   
}   
 
   
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.

2. 定义接口

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

3. 实现抽象类和接口

public class Duck : Animal, IAction   
{   
public Duck(string name)   
{   
_name = name;   
}   
//重载抽象方法   
 
public override void Show()   
{   
Console.WriteLine(_name + " is showing for you.");   
}   
 
//重载抽象属性   
 
public override string Name   
{   
get { return _name;}   
}   
 
//实现接口方法   
 
public void Move()   
{   
Console.WriteLine("Duck also can swim.");   
}   
}   
 
public class Dog : Animal, IAction   
{   
public Dog(string name)   
{   
_name = name;   
}   
public override void Show()   
{   
Console.WriteLine(_name + " is showing for you.");   
}   
 
public override string Name   
{   
get { return _name; }   
 
}   
 
public void Move()   
{   
Console.WriteLine(_name + " also can run.");   
}   
}   
 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.

4. 客户端实现

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

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

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

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

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

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

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

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

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

【编辑推荐】

  1. 什么是.NET接口?什么是.NET抽象类?
  2. C#接口定义学习经验
  3. 概述C# COM接口相关知识
  4. 浅谈C#抽象类和C#接口
  5. C# ICloneable接口应用浅析
责任编辑:yangsai 来源: 网络转载
相关推荐

2009-08-10 10:04:25

C#抽象类C#接口

2009-07-30 18:36:00

C#接口C#抽象类

2011-07-06 10:33:31

C#

2011-07-12 15:58:48

java抽象类接口

2009-08-03 18:12:31

C#抽象类

2009-09-04 13:31:33

C#抽象类

2012-02-29 09:32:01

Java

2011-06-28 10:55:20

C#接口抽象类

2009-04-30 15:15:01

Java抽象类接口

2010-03-04 09:40:04

Java接口抽象类

2011-05-19 18:01:56

JAVA

2011-07-10 14:07:59

JAVA

2009-06-16 11:30:00

Java抽象类Java接口

2009-06-14 21:31:29

Java抽象类Java接口

2011-12-22 10:48:21

Java

2015-03-23 09:33:43

Java抽象类Java接口Java

2021-12-23 07:11:31

开发

2009-11-23 20:00:25

PHP5接口PHP5抽象类

2020-10-19 13:03:16

Java 8接口抽象类

2020-02-07 10:55:37

抽象类接口秒懂
点赞
收藏

51CTO技术栈公众号