我是C#界面的新手。那么有人可以解释当我们创建一个接口对象时实际发生了什么吗?
我知道为什么我们在其他语言中有接口但却无法真正掌握为什么C#允许创建接口的对象(实例)的逻辑? 如果接口没有函数定义或变量,那么如何创建对象?
我一直在论坛上搜索,但无法明白这一点。 这是我在界面上找到的教程 http://www.c-sharpcorner.com/uploadfile/6897bc/interfaces-in-C-Sharp/ 如果您访问该链接,您可以看到作者首先创建一个类的对象而不是一个inteface对象。当他写作
Interface_object = class_object;
接口对象从类对象中提取特征...
如果界面中没有实现和变量,它会如何以及为什么会发生?
答案 0 :(得分:11)
实际上您无法创建接口的实例。
您创建了某个类的实例,实现了该接口。实际上可以有几十个类,实现一个接口。因此,当您使用接口类型的变量时,唯一可以保证的是,实际由变量引用的对象实现了接口,您可以使用任何接口方法,属性等。
interface IFoo
{
void DoFoo();
}
class Foo1: IFoo
{
public DoFoo()
{
//one implementation
}
}
class Foo2: IFoo
{
public DoFoo()
{
//the other implementation
}
}
IFoo tmp = new Foo1();
tmp = new Foo2();
中看到深入的解释
答案 1 :(得分:2)
有人可以解释当我们创建一个接口对象时实际发生了什么吗?
我喜欢使用的类比是接口就像一个掩码 - 当你创建一个实现接口的类的实例(例如 IFoo )时,然后将该类视为接口然后界面就像一个演员会穿的面具 - 即使面具(界面)下面有很多东西,这个类看起来像是界面(蒙版)。
但是不能真正掌握为什么C#允许创建接口的对象(实例)的逻辑?
另一件要提到的是接口是一个契约 - 无论在接口上定义了什么方法/属性/等,都保证在类上实现。彼此完全完全不同的类可以实现相同的接口 - 当您拥有每个类的实例并将其作为接口处理(转换)时,可以在每个类上调用相同的方法,尽管实现(实际代码)在每个类中都可以大不相同。
示例:强>
类Car
和Human
都实现了接口IMove
,而IMove
定义了方法void Move();
。它们都是完全不相关的类,没有共同的祖先,但是如果你有Car和Human的实例,那么它们都保证有方法void Move()
,尽管那个方法中的代码会因为它们而有所不同。以完全不同的方式行动。如果然后将这些不同的对象转换为同一个接口(var x = (IMove) someCar
或var x = someHuman as IMove
),那么您可以相同地处理对象引用。
接口和抽象类有一些相似之处 - 它们都以契约方式指定事物(扩展器或实现者必须实现特定的东西),并且它们都不能直接创建(区别在于抽象类可以提供一些实现,而接口不能,接口只能实现,永远不能继承。)
如果您想知道在MSIL级别下会发生什么,那么周围还有其他更有资格的人可以详细说明。
答案 2 :(得分:1)
接口就是一个接口。您无法实例化接口。您可以将它用作指向实现该接口的类的变量。 Interface是方法/属性的公共集合,保证其所有方法都已实现。抽象类与接口类似,但它不提供这样的保证。
在OOP中,这是一种多态性,还有其他类型的多态性。
答案 3 :(得分:0)
您无法创建接口的对象,但您可以创建类的对象并让该类使用该接口。
答案 4 :(得分:0)
您无法实例化接口。 但是,如果类正在实现接口,则可以创建接口的新引用。
这只是创建对象MyNokiaOldPhone
INokiaOld iface = phone;
的新引用,它实现了接口INokiaOld
。
答案 5 :(得分:0)
您不是创建接口的实例,而是将派生的对象实例引用分配给它,因此它将包装到该接口类型中。这是 polymorphysm 。
答案 6 :(得分:0)
据我所知你不能创建一个接口的实例,即使我们这样做也没有用,因为该类中没有任何成员被实现。抽象类的情况也是如此。这是因为它们不完整(即它们充当模板),并且对于不完整的类,对象的创建没有意义。