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

在 Git for Visual Studio 2012 中恢复到以前的提交

为什么不能使用 null 作为 Dictionary 的键?

我应该创建一个 DateRange 对象吗?

是否有任何为 C# 编写的模糊搜索或字符串相似函数库?

NonSerialized 属性

如何从标头中检索基本身份验证凭据?

为什么我得到 411 Length required 错误?

将笔画应用于 WPF 中的文本块

C# 是否(或将)包含用于副作用验证的功能?

extern 在 C# 中是如何工作的?

如何在 C# 4.0 中使任务进入睡眠状态(或延迟)?

日期时间是什么意思?在 C# 中是什么意思?

关于 Enumerable.Range 与传统 for 循环的 foreach 的思考

Double.TryParse 或 Convert.ToDouble - 哪个更快更安全?

如何允许程序集(单元测试)访问另一个程序集的内部属性?

使用语句与最终try

了解 C# 中的协变和逆变接口

ADO.NET Entity Framework:更新向导不会添加表

仅从 DateTime 对象获取日期或时间

如何更改 C# .NET 3.5 中进度条的 colored颜色 ?