我真的找不到接口的原因.据我所知,这是一种解决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.任何实现类都必须拥有的一组公共方法.从技术上讲,接口只控制语法,即有哪些方法、它们得到哪些参数以及它们返回什么.通常它们也封装了语义,尽管这只是通过文档实现的.

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

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

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

.net相关问答推荐

跨请求共享数据

如何正确使用await using语法?

如何调试 .NET 运行时中的内部错误?

SqlDateTime.MinValue != DateTime.MinValue,为什么?

.NET 中是否有一种简单的方法来获得数字的st、nd、rd和th结尾?

我可以从我的应用程序中抛出哪些内置 .NET 异常?

泛型方法是如何、何时、何地具体化的?

app.config 文件和 XYZ.settings 文件有什么区别?

.net:System.Web.Mail 与 System.Net.Mail

如何创建只读依赖属性?

.net 服务总线建议?

如何在 C# 中仅设置 DateTime 变量的时间部分

如何在 WebBrowser 控件中注入 Javascript?

如何正确和完全关闭/重置 TcpClient 连接?

如何获得 Bin 路径?

使用 LINQ 搜索树

MemoryCache 不遵守配置中的内存限制

/langversion 的错误选项6无效;必须是 ISO-1、ISO-2、3、4、5 或默认值

Windows 服务在哪个目录中运行?

您可以将 Microsoft Entity Framework 与 Oracle 一起使用吗?