我真的找不到接口的原因.据我所知,这是一种解决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相关问答推荐

无法对.NET MAUI类库进行单元测试

NET 6:控制器方法不可访问

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

线程安全性的单元测试?

关于在 .NET 中干净地终止线程的问题

如何使用 Moq 为不同的参数设置两次方法

为什么 StyleCop 建议在方法或属性调用前加上this?

发布版本中的 Debug.WriteLine

如何将字符串列表数据绑定到 WPF/WP7 中的 ListBox?

C# 中的 myCustomer.GetType() 和 typeof(Customer) 有什么区别?

将跟踪输出重定向到控制台

.NET - 实现捕获所有异常处理程序的最佳方法是什么

如何遍历字典并更改值?

如何在可取消的异步/等待中处理 TransactionScope?

mscorlib 代表什么?

等待 Async Void 方法调用以进行单元测试

obj 文件夹是为了什么而生成的?

ConfigurationManager.AppSettings - 如何修改和保存?

C# 应用程序中的资源和嵌入式资源有什么区别?

在构建事件命令行中放置注释的正确方法?