第一个示例中的接口没有被实例化,而是实例化的Cat()
实例的类型被声明为类型ICat
而不是Cat
。
在你的具体例子中,这不是很有趣。然而,考虑到了以下声明的接口:一旦这个接口被应用到多个具体类型
public interface ICat
{
Meow();
Run();
Hunt();
}
,行为可以在各种类应用,同时始终贯彻相同的行为。
public class Lion : ICat
{
public void Roar();
public void Meow();
public void Run();
public void Hunt();
}
public class Tiger : ICat
{
public void Meow();
public void Run();
public void Hunt();
}
ICat lion = new Lion();
ICat tiger = new Tiger();
两个具体事例可以受益于接口只有靠接口担保,除非铸造自己的具体类型的方法保证所有这三种方法。这提供了跨行为的一致性。但是请注意,这不是实例化接口。它只是将具体实例分配给语言允许的共享接口类型。
结果:
lion.Run();
和tiger.Run()
都是完全允许的。
然而,
lion.Roar()
不会编译,因为它不是由接口保证。也就是说,如果转换为实际实例化并随后分配给接口的基础具体类型,则除了接口的方法外,还可以访问该类型的方法。
((Lion)lion).Roar();
同样:实例化时
Lion concreteLion = new Lion();
没有分配到的接口。因此它可以直接访问接口保证的所有三种方法,并且可以在不需要转换的情况下调用concreteLion.Roar()
,因为实例已直接分配给具体类型而不是由Lion类实现的接口。
如果两行都实例化一类Cat。那么我们如何直接或间接地实例化一个接口呢? –
你不能实例化接口。你只能实例化碰巧实现该接口的类。 – MarcinJuraszek
那么这两个声明有什么区别? '猫猫=新猫();'和'猫猫1 =新猫();'。你可以请进一步。 –