[英]Collection of type interface C#
我刚刚完成了一个大学实验室,实验室要求我使用Volume
方法创建一个接口IHasVolume
,然后创建一个类Sphere
,它实现了该接口,默认情况下它是方法。 然后我必须创建一个Test
并通过对接口的引用以多态方式调用我的类中的方法。
我的代码片段:
IHasVolume i = new Sphere { Radius = 2 };
我还必须收集 Spheres 并调用各种方法
IHasVolume[] collection = { new Sphere(4), new Sphere(6), new Sphere(9), new Sphere(10), };
foreach(IHasVolume s in collection)
{
Console.WriteLine("Volume: " + s.Volume());
Console.WriteLine("Radius: " + s.ToString());
}
现在我不确定我是否真的被要求制作IHasVolume
类型的数组,但我做到了并且它有效,但我很困惑它为什么有效, Sphere 不是IHasVolume
的子类,还是?
有人可以向我解释一下吗?
子类和超类之间的关系类似于实现类和接口的关系。 您可以将接口视为纯抽象基类,它不包含逻辑,仅包含公共方法(和属性)签名。
所以是的,您的Sphere
与IHasVolume
具有 is-a 关系,并且其行为与您具有继承的抽象HasVolume
类相同。
它不是一个子类,但如果您有一个名为HasVolume
的基类而不是一个接口,则行为会相似。 但有一个重要的区别。 您的HasVolume
基类需要自己实现它定义的方法。
这不是接口的情况。 您遵从实施者来定义操作,在本例中为Sphere
。 当您不需要基本实现时,这是有道理的。
对于您的示例,您可以从数组中获取体积并将它们总计,而无需关心它们是什么类型的容器 - 球体、圆柱体等。它们可以相应地计算自己的体积,但您的方法不需要关心如何他们正是这样做的。 你只想知道他们能装多少啤酒:)。
如果你做类似的事情
IBlah blah = new BlahImpl();
在这个例子中你可以做的是实例化一个具体的类,但将结果对象分配给一个接口。
效果与实例化一个没有接口的类相同。
您创建了一个IHasVolume
类型的数组,这意味着它的项目不仅可以是Sphere
,还可以是从该接口继承的任何类...
在您的循环中,您还将其指定为接口类型,这意味着从该接口继承的任何对象都可以接受...
接口是实现后期绑定多态的方法,因此当一个类实现该接口时,它确保所有接口成员都可以使用并且您可以调用它。 接口的一个经典示例是 ICar,它代表汽车,然后不同汽车的模型将实现 ICar 接口,因此每个模型都可以有它们的实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.