日期:2014-05-18  浏览次数:21017 次

新手对接口 Interface,理解很吃力,望前辈点拨
MSDN上只说“接口只包含方法、委托或事件的签名。方法的实现是在实现接口的类中完成的”
这句话我怎么看也没看出下面这段程序是如何体现接口的,下面的代码是摘自“c# 入门经典第三版".书中说也可以把值类型封箱到一个接口类型。这接口类型又是什么类型?那个IMyinterface refType = valType1 我没法理解,难道可以象定义类的引用那样定义一个类型的引用,而这个类型是个接口?这都是什么意思啊?


[code=C#][/code]
class Program
  {

  interface IMyinterface
  {
  }

  struct MyStruct : IMyinterface
  {
  public int Val;
  }


  static void Main(string[] args)
  {
  MyStruct valType1 = new MyStruct();

  IMyinterface refType = valType1;


  MyStruct ValType2 = (MyStruct)refType;
  }
  }



------解决方案--------------------
MyStruct继承了接口IMyinterface

但IMyinterface里没有要实现的方法,所以这样就行。


IMyinterface refType = valType1;
IMyinterface 是refType的父类,这样表示当然也行啊


------解决方案--------------------
你给的代码是接口的特例,它是为了说明可以让值类型(结构体)继承一个接口。

一个类型,很明显,也是它的父类型。比如,男人继承自人,那么
男人 张三也可以是人 张三。

一个接口相当于一个抽象的基类。
------解决方案--------------------
书中说也可以把值类型封箱到一个接口类型。

一种泛化说法。也没错。.net下,所有都是继承自Object。都是类型。
------解决方案--------------------
比如

interface I驾驶技能
{
void DoDrive();
}

class Man
{
public virtual void DoEat(Food f) { ... } 
public virtual void DoSleep() { ... }
}

class 驾驶员 : Man, I驾驶技能
{
public void DoDrive() { ... }
}

调用:
Man 张三 = new 驾驶员(); // 张三是一个驾驶员
I驾驶技能 drv = 张三; // 驾驶员有驾驶技能
------解决方案--------------------
.net和java不支持多重继承,此时只能使用interface。反过来说,当你设计一个应用接口,考虑到使用它的对象可能原来已经从其它class继承了,所以往往不得不使用interface来实现这个应用接口,因为java/.net不支持多重继承。
------解决方案--------------------
注意,我上面不是在写概念,而是再说使用方面的问题。
------解决方案--------------------
IMyinterface refType = valType1;

是不是写成 IMyinterface refType = valType1 as IMyinterface ;

更直观些?
------解决方案--------------------
比如说,接着#5楼的例子,假设我们还要说明“驾驶员”继承自“中国公民”,那么就没有办法去继承作为class的中国公民了。尽管每一次都要去实现interface的接口令人痛苦,我们也不得不让驾驶员去继承自 I中国公民 这个interface,然后逐一手工实现这个接口的所有属性和方法,而无法使用class继承。

这是从实际编程的角度来说的,是说.net和java不支持多重继承的特性带来的副作用。从设计角度,class和interface都是一样的,都可以作为对象的分类来使用。甚至你在设计一个对象类的继承结构时,没有必要去搞清楚它的父类是class还是interface。在设计时它们的作用是一样的。

但是在编程时稍有区别。除了interface没有去实现任何代码继承以外,interface还不具有继承特点,也就是说如果你希望子interface也具有父interface,必须重复声明。而class支持继承,即子类自动具有父类多具有的interface。
------解决方案--------------------
探讨

IMyinterface refType = valType1;

是不是写成 IMyinterface refType = valType1 as IMyinterface ;

更直观些?

------解决方案--------------------
代码
C# code
  MyStruct valType1 = new MyStruct();

  IMyinterface refType = valType1;

------解决方案--------------------
探讨
比如说,接着#5楼的例子,假设我们还要说明“驾驶员”继承自“中国公民”,那么就没有办法去继承作为class的中国公民了。尽管每一次都要去实现interface的接口令人痛苦,我们也不得不让驾驶员去继承自 I中国公民 这个interface,然后逐一手工实现这个接口的所有属性和方法,而无法使用class继承。

这是从实际编程的角度来说的,是说.net和java不支持多重继承的特性带来的副作用。……

------解决方案--------------------