基于C#的接口基础教程之四
2009-11-12 17:58
495 查看
对接口方法的调用和采用索引指示器访问的规则与类中的情况也是相同的 |
对接口成员的访问
对接口方法的调用和采用索引指示器访问的规则与类中的情况也是相同的。如果底层成员的命名与继承而来的高层成员一致,那么底层成员将覆盖同名的高层成员。但由于接口支持多继承,在多继承中,如果两个父接口含有同名的成员,这就产生了二义性(这也正是C#中取消了类的多继承机制的原因之一),这时需要进行显式的定义:
类对接口的实现
前面我们已经说过,接口定义不包括方法的实现部分。接口可以通过类或结构来实现。我们主要讲述通过类来实现接口。用类来实现接口时,接口的名称必须包含在类定义中的基类列表中。
下面的例子给出了由类来实现接口的例子。其中ISequence 为一个队列接口,提供了向队列尾部添加对象的成员方法Add( ),IRing 为一个循环表接口,提供了向环中插入对象的方法Insert(object obj),方法返回插入的位置。类RingSquence 实现了接口ISequence 和接口IRing。
using System ; interface ISequence { object Add( ) ; } interface ISequence { object Add( ) ; } interface IRing { int Insert(object obj) ; } class RingSequence: ISequence, IRing { public object Add( ) {…} public int Insert(object obj) {…} } |
using System ; interface IControl { void Paint( ); } interface ITextBox: IControl { void SetText(string text); } interface IListBox: IControl { void SetItems(string[] items); } interface IComboBox: ITextBox, IListBox { } |
前面我们已经看到,一个类可以实现多个接口。再看下面的例子:
interface IDataBound { void Bind(Binder b); } public class EditBox: Control, IControl, IDataBound { public void Paint( ); public void Bind(Binder b) {...} } |
public class EditBox: IControl, IDataBound { void IControl.Paint( ) {...} void IDataBound.Bind(Binder b) {...} } |
class Test { static void Main( ) { EditBox editbox = new EditBox( ); editbox.Paint( ); //错误: EditBox 没有Paint 事件 IControl control = editbox; control.Paint( ); // 调用 EditBox的Paint事件 } } |
如果每个成员都明显地指出了被实现的接口,通过这种途径被实现的接口我们称之为显式接口成员(explicit interface member)。 用这种方式我们改写上面的例子:
public class EditBox: IControl, IDataBound { void IControl.Paint( ) {…} void IDataBound.Bind(Binder b) {…} } |
class CTest { static void Main( ) { EditBox editbox = new EditBox( ) ; editbox.Paint( ) ; //错误:不同的方法 IControl control = editbox; control.Paint( ) ; //调用 EditBox的Paint方法 } } |
注释:接口本身不提供所定义的成员的实现,它仅仅说明这些成员,这些成员必须依靠实现接口的类或其它接口的支持。
知道了怎样访问接口,我们还要知道怎样实现接口,要实现C#的接口,请看下一节-实现接口
using System ; interface ISequence { int Count { get; set; } } interface IRing { void Count(int i) ; } interface IRingSequence: ISequence, IRing { } class CTest { void Test(IRingSequence rs) { //rs.Count(1) ; 错误, Count 有二义性 //rs.Count = 1; 错误, Count 有二义性 ((ISequence)rs).Count = 1; // 正确 ((IRing)rs).Count(1) ; // 正确调用IRing.Count } } |
再看下面的例子:
using System ; interface IInteger { void Add(int i) ; } interface IDouble { void Add(double d) ; } interface INumber: IInteger, IDouble {} class CMyTest { void Test(INumber Num) { // Num.Add(1) ; 错误 Num.Add(1.0) ; // 正确 ((IInteger)n).Add(1) ; // 正确 ((IDouble)n).Add(1) ; // 正确 } } |
接口的多重继承的问题也会带来成员访问上的问题。例如:
interface IBase { void FWay(int i) ; } interface ILeft: IBase { new void FWay (int i) ; } interface IRight: IBase { void G( ) ; } interface IDerived: ILeft, IRight { } class CTest { void Test(IDerived d) { d. FWay (1) ; // 调用ILeft. FWay ((IBase)d). FWay (1) ; // 调用IBase. FWay ((ILeft)d). FWay (1) ; // 调用ILeft. FWay ((IRight)d). FWay (1) ; // 调用IBase. FWay } } |
http://blog.163.com/mad010@126/blog/static/12237155200841645211935/
相关文章推荐
- 【转】基于C#的接口基础教程之五(4)
- 基于C#的接口基础教程
- 基于C#的接口基础教程之六
- 基于C#的接口基础教程[3]
- 基于C#的接口基础教程之三_C#教程
- 基于C#的接口基础教程之七_C#教程
- 基于C#的接口基础教程之七
- 基于C#的接口基础教程之一
- 基于C#的接口基础教程之二
- 基于C#的接口基础教程之三
- 基于C#的接口基础教程之一
- 基于C#的接口基础教程之五
- 基于C#的接口基础教程[4]
- 基于C#的接口基础教程之四
- [转]基于C#的接口基础教程之一
- 基于C#的接口基础教程之一
- 基于C#的接口基础教程[1]
- 基于C#的接口基础教程之七_C#教程
- 基于C#的接口基础教程之一_C#教程
- 基于C#的接口基础教程之一