繁体   English   中英

C# 类型接口的集合

[英]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的子类,还是?

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

子类和超类之间的关系类似于实现类和接口的关系。 您可以将接口视为纯抽象基类,它不包含逻辑,仅包含公共方法(和属性)签名。

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

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

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

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

如果你做类似的事情

IBlah blah = new BlahImpl();

在这个例子中你可以做的是实例化一个具体的类,但将结果对象分配给一个接口。

效果与实例化一个没有接口的类相同。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM