我是C#.net的新手,很惊讶地知道可以创建一个Interface的实例,例如
Iinterface myDimensions = (Iinterface) myBox;
如何为这种类型的语句分配内存?内存分配在堆上吗?
任何人都可以给出使用这种类型的实例化的任何情况。
为什么在语言中强制执行这样的约束?
谢谢,
最佳答案
在回答您的第一个问题之前,我注意到您在这里有两个问题。将来,当您有两个问题时,请考虑在Stack Overflow上问两个单独的问题。您可能已经注意到,当您同时提出两个问题时,几乎每个人都会忽略第二个问题。
Iinterface myDimensions = (Iinterface) myBox;
正如其他人指出的那样,这不一定是创建实现该接口(interface)的类型的实例。似乎每个人都匆忙忘记了告诉您引用转换不分配内存的原因是装箱转换确实分配了内存。如果myBox是结构类型,则它将在堆上为“包装器”分配内存,并在包装器中复制值。然后,包装器实现接口(interface)。
继续您的第二个问题:
显式接口(interface)实现的目的是使类能够实现特定的接口(interface),而无需那些方法出现在不需要的位置。例如,假设您有:
class MyConnection : IDisposable
{
public void OpenConnnection() { ... }
public void CloseConnection() { ... }
public void Dispose() { ... CloseConnection(); ... }
}
如果处置打开的连接与关闭连接相同,那么您可能不希望通过以下两种方式来使用户感到困惑:(1)使用两个做相同事情的方法,或者(2)将方法OpenConnection与非显而易见的方法配对像Dispose之类的名称。通过使您可以使Dispose“不可见”(除非将对象转换为IDisposable),可以使用户更容易发现正确的操作。
另一个使用这种情况的情况是当您有两个名称相同的接口(interface)时:
interface IFoo { void M(); }
interface IBar { void M(); }
现在,您如何制作一个同时实现IFoo和IBar但对这两种M方法具有不同实现的类C?如果要两个不同的主体,则必须对其中一个或两个都使用显式实现。