C#接口和抽象类的区别

C#接口和抽象类的相同:

1.都不能对方法或属性的具体的实现;

2.都可以被继承;

3.都不可以被实例化。

C#接口和抽象类的区别:

1.接口是一种类型,不能包含静态的成员,不能包括变量的定义,定义的方法或属性默认为public的,不能加public修饰,继承接口的类在实现接口的成员时必须为public的。

2.抽象类本身是类的修饰符,不是一种类型,可以有静态的成员,变量的定义,非抽象的方法(但必须实现),可以有virtual方法,抽象类的子类必须全部实现父类中的抽象的

成员,且应与父抽象类的抽象成员的修饰一致(即public或protected).

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

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

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

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

C#接口和抽象类Animal示例

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

设计结构如图所示:

设计结构图

1. 定义抽象类

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

2. 定义接口

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

3. 实现抽象类和接口

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

4. 客户端实现

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

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

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

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

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

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

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

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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值