类型接口 C# 的集合

Collection of type interface C#

我刚刚完成了一个大学实验,该实验要求我使用 Volume 方法创建一个接口 IHasVolume,然后创建一个 class、Sphere,它实现了接口,默认情况下它是方法。 然后我必须创建一个 Test 并通过对接口的引用以多态方式调用我的 class 中的方法。

我的代码片段:

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 的子 class,是吗?

有人可以给我解释一下吗?

如果你这样做

IBlah blah = new BlahImpl();

您在此示例中可以做的是实例化一个具体的 class,但将生成的对象分配给一个接口。

效果与实例化一个没有界面的 class 相同。

subclass 和 superclass 之间的关系类似于实现 class 和接口的关系。您可以将接口视为不包含任何逻辑、仅包含 public 方法(和 属性)签名的纯抽象基础 class。

所以,是的,您的 SphereIHasVolume 具有 is-a 关系,并且其行为与抽象 HasVolume class 相同继承。

您创建了一个 IHasVolume 类型的数组,这意味着它的项目不仅可以是 Sphere,而且可以是从该接口继承的任何 class...

在您的循环中,您还将它指定为接口的一种类型,这意味着从该接口继承的任何对象都是可接受的...

接口是实现后期绑定多态的方式 因此,当 class 实现接口时,它确保可以使用所有接口成员并且您可以调用它。 classic 接口示例是代表汽车的 ICar,然后不同汽车的模型将实现 ICar 接口,因此每个模型都可以有自己的实现。

它不是子class,但如果您有一个名为 HasVolume 的基础 class 而不是接口,则行为会相似。但与有重要区别。您的 HasVolume 基础 class 需要自己实现它定义的方法。

接口不是这种情况。您让实施者来定义操作,在本例中为 Sphere。当您不需要基本实现时,这是有道理的。

对于您的示例,您可以从数组中获取体积并计算它们的总和,而无需关心它们是什么类型的容器 - 球体、圆柱体等。它们可以相应地计算它们自己的体积,但您的方法不需要关心他们到底是怎么做到的。你只想知道他们能装多少啤酒:)。