我真的找不到接口的原因.据我所知,这是一种解决C#中不存在的多重继承问题的方法(至少我是这么听说的).

我看到的是,您预定义了一些成员和函数,然后必须在类中重新定义它们.从而使接口变得多余.这感觉就像是句法上的…嗯,对我来说是垃圾(请不要冒犯我,垃圾就是无用的东西).

下面给出的例子取自堆栈溢出上的另一个C#接口线程,我只创建一个名为Pizza的基类,而不是接口.

简单示例(取自不同的堆栈溢出贡献)

public interface IPizza
{
    public void Order();
}

public class PepperoniPizza : IPizza
{
    public void Order()
    {
        //Order Pepperoni pizza
    }
}

public class HawaiiPizza : IPizza
{
    public void Order()
    {
        //Order HawaiiPizza
    }
}

推荐答案

关键是这个接口代表一个contract.任何实现类都必须拥有的一组公共方法.从技术上讲,接口只控制语法,即有哪些方法、它们得到哪些参数以及它们返回什么.通常它们也封装了语义,尽管这只是通过文档实现的.

然后,您可以拥有一个接口的不同实现,并随意交换它们.在您的示例中,因为每个披萨实例都是IPizza,所以在处理未知披萨类型的实例时都可以使用IPizza.任何类型继承自IPizza的实例都保证是可排序的,因为它有一个Order()方法.

Python不是静态类型的,因此在运行时保留并查找类型.因此,您可以try 在任何对象上调用Order()方法.只要对象有这样一个方法,并且可能只是耸耸肩说»Meh,运行时就会很高兴.«如果不是.在C#中不是这样.编译器负责进行正确的调用,如果只是有一些随机变量,编译器还不知道实例在运行时是否会有该方法.从编译器的Angular 来看,它是无效的,因为它无法验证它.(你可以用reflection或dynamic关键字来做这样的事情,但我想这现在有点过头了.)

还要注意,通常意义上的接口不一定非要是C#interface,它也可以是抽象类,甚至可以是普通类(如果所有子类都需要共享一些公共代码,这会派上用场--不过,在大多数情况下,interface就足够了).

.net相关问答推荐

为什么 GetShortestDayName 返回的名称比预期的短?

C#/.NET + VisualStudio,命名空间问题

使用 SSH.NET 查找具有特定文件名的最新 SFTP 文件

当 Func 委托需要接口作为参数时,它是如何工作的?

将客户端证书添加到 .NET Core HttpClient

更新 .NET Web 服务以使用 TLS 1.2

无法加载文件或程序集“System.ValueTuple”

使用带有大数据的 SqlCommand 异步方法的可怕性能

“x 为 null”和“x == null”有什么区别?

找不到用于调试 .NET 源代码的 .cs 文件

具有不同身份验证标头的 HttpClient 单个实例

从 Visual Studio 2015 发布 - 允许不受信任的证书

多个等待与 Task.WaitAll - 等效?

Roslyn 编译代码失败

如何在 ASP.NET Core MVC 中读取操作方法的属性?

HttpClient 和使用代理 - 不断得到 407

为什么递增 Nullable 不会引发异常?

String.Equals(a,b) 如何不产生 StackOverflowException?

使用给定的 DateTime 对象获取一个月的第一天和最后一天

如何在 Visual Studio 中选择 .NET 4.5.2 作为目标框架