c_接口详解

1994_

贡献于2016-10-07

字数:4329 关键词: C/C++开发

·                C#接口定义及实例应用浅析 C#接口定义是什么呢?C#接口定义相关的一些内容是什么?C#接口定义的学习需要注意什么呢?那么本文就向你详细介绍这些内容。 C#接口定义是什么呢?其实,C#接口定义的就是一种约定,使得实现接口的类或结构在形式上保持一致。个人觉得,使用接口可以使程序更加清晰和条理化,这就是接口的好处,但并不是所有的编程语言都支持接口,C#是支持接口的。注意,虽然在概念上,C#接口类似于COM接口,但他们的底层结构是不同的。那么,我们来看一下如何声明和使用接口。 C#接口定义之声明接口 声明接口在语法上和声明抽象类完全相同,例如这里有一个银行账户的接口: 1. public interface IBankAccount   2. {   3. void PayIn(decimal amount);   4. bool Withdraw(decimal amount);   5.   6. decimal Balance   7. {   8. get;   9. }   10. }   注意:接口中只能包含方法、属性、索引器和事件的声明。不允许声明成员上的修饰符,即使是pubilc都不行,因为接口成员总是公有的,也不能声明为虚拟和静态的。如果需要修饰符,最好让实现类来声明。 C#接口定义之使用接口的实例: 这是书上的一个简单的例子,但足以说明接口的使用方法。 一个银行账户的接口,两个不同银行账户的实现类,都继承于这个接口。接口声明如上。下面是两个账户类: 11. class SaverAccount : IBankAccount   12. {   13. private decimal balance;   14.   15. public decimal Balance   16. {   17. get    18. {   19. return balance;   20. }   21. }   22.  public void PayIn(decimal amount)   23. {   24. balance += amount;   25. }   26.  public bool Withdraw(decimal amount)   27. {   28. if (balance >= amount)   29. {   30. balance -= amount;   31. return true;   32. }   33. Console.WriteLine("Withdraw failed.");   34. return false;   35. }   36.  public override string ToString()   37. {   38. return String.Format("Venus Bank Saver:Balance={0,6:C}", balance);   39. }   40. }   41.  class GoldAccount : IBankAccount   42. {   43. private decimal balance;   44.  public decimal Balance   45. {   46. get    47. {   48. return balance;   49. }   50. }   51.  public void PayIn(decimal amount)   52. {   53. balance += amount;   54. }   55.  public bool Withdraw(decimal amount)   56. {   57. if (balance >= amount)   58. {   59. balance -= amount;   60. return true;   61. }   62. Console.WriteLine("Withdraw failed.");   63. return false;   64. }   65.  public override string ToString()   66. {   67. return String.Format(   68. "Jupiter Bank Saver:Balance={0,6:C}", balance);   69. }   70. }   可见,这两个实现类多继承了IBankAccount接口,因此它们必须要实现接口中的所有声明的方法。要不然,编译就会出错。让我们来测试一下,下面是测试代码: 71. static void Main(string[] args)   72. {   73. IBankAccount venusAccount = new SaverAccount();   74. IBankAccount jupiterAccount = new CurrentAccount();   75. venusAccount.PayIn(200);   76. jupiterAccount.PayIn(500);   77. Console.WriteLine(venusAccount.ToString());   78. jupiterAccount.PayIn(400);   79. jupiterAccount.Withdraw(500);   80. jupiterAccount.Withdraw(100);   81. Console.WriteLine(jupiterAccount.ToString());   82.  }   请注意开头两句,我们把它们声明为IBankAccount引用的方式,而没有声明为类的引用,为什么呢?因为,这样我们就可以让它指向执行这个接口的任何类的实例了,比较灵活。但这也有个缺点,如果我们要执行不属于接口的方法,比如这里重载的ToString()方法,就要先把接口的引用强制转换成合适的类型了。 C#接口定义之接口的继承 接口也可以彼此继承,就象类的继承一样。比如我们又声明一个接口ITransferBankAccount,它继承于IBankAccount接口。 83. interface ITransferBankAccount : IBankAccount    84. {   85. bool TransferTo(IBankAccount destination, decimal amount);   86. }  在这个接口中,又新增加了一个方法TransferTo(),所以如果我们要写一个类从ITransferBankAccount继承的话,就必须要实现IBankAccount和ITransferBankAccount两个接口所有的方法声明。即: 87. class CurrentAccount : ITransferBankAccount   88. {   89. private decimal balance;   90.  public decimal Balance   91. {   92. get  93. {   94. return balance;   95. }   96. }   97.  public void PayIn(decimal amount)   98. {   99. balance += amount;   100. }   101.  public bool Withdraw(decimal amount)   102. {   103. if (balance >= amount)   104. {   105. balance -= amount;   106. return true;   107. }   108. Console.WriteLine("Withdraw failed.");   109. return false;   110. }   111. public override string ToString()   112. {   113. return String.Format(   114. "Jupiter Bank Saver:Balance={0,6:C}", balance);   115. }   116.  public bool TransferTo(   117. IBankAccount destination, decimal amount)   118. {   119. if (Withdraw(amount))   120. {   121. destination.PayIn(amount);   122. return true;   123. }   124. else  125. {    126. return false;   127. }   128. }   129. }   C#接口定义的一些总结: 1、C#中的接口是独立于类来定义的。这与 C++模型是对立的,在 C++中接口实际上就是抽象基类。 2、接口和类都可以继承多个接口。 3、类可以继承一个基类,接口根本不能继承类。这种模型避免了 C++的多继承问题,C++中不同基类中的实现可能出现冲突。因此也不再需要诸如虚拟继承和显式作用域这类复杂机制。C#的简化接口模型有助于加快应用程序的开发。 4、一个接口定义一个只有抽象成员的引用类型。C#中一个接口实际所做的,仅仅只存在着方法标志,但根本就没有执行代码。这就暗示了不能实例化一个接口,只能实例化一个派生自该接口的对象。 5、接口可以定义方法、属性和索引。所以,对比一个类,接口的特殊性是:当定义一个类时,可以派生自多重接口,而你只能可以从仅有的一个类派生。  转:http://developer.51cto.com         二、详解C#接口定义和继承的区别       C#接口定义     C#不支持多重继承,但是客观世界出现多重继承的情况又比较多。为了避免传统的多重继承给程序带来的复杂性等问题,C# 提出了接口的概念。通过接口可以实现多重继承的功能。     实现接口的类或结构要与接口的定义严格一致。接口描述可属于任何类或结构的一组相关行为。接口可由方法、属性、事件、索引器或这4种成员类型的任何组合构成。接口不能包含字段。接口成员一定是公共的。     类和结构可以像类继承基类或结构一样从接口继承,而且可以继承多个接口。当类或结构继承接口时,它继承成员定义但不继承实现。若要实现接口成员,类中的对应成员必须是公共的、非静态的,并且与接口成员具有相同的名称和签名。类的属性和索引器可以为接口上定义的属性或索引器定义额外的访问器。例如,接口可以声明一个带有get访问器的属性,而实现该接口的类可以声明同时带有get和set访问器的同一属性。但是,如果属性或索引器使用显式实现,则访问器必须匹配。     接口可以继承其他接口。类可以通过其继承的基类或接口多次继承某个接口。在这种情况下,如果将该接口声明为新类的一部分,则类只能实现该接口一次。如果没有将继承的接口声明为新类的一部分,其实现将由声明它的基类提供。基类可以使用虚拟成员实现接口成员,在这种情况下,继承接口的类可通过重写虚拟成员来更改接口行为。     定义接口     接口的声明采用下列格式:     修饰符interface接口名称:继承的接口列表     {     接口内容;     }     其中,除interface 和接口名称,其他的都是可选项,下面是一个C#接口定义的例子,代码如下:     public interface iSomeInterface { void UpdateDataBase(); }     接口继承     一个接口可以从一个或多个基接口继承。例如:     interface iOthrerInterface :iSomeInterface,iCom { int CompareTo(object obj); }    转载:http://www.bitscn.com/pdb/dotnet/201003/181918.html

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ]
0 人已下载

下载文档

相关文档