c# - 接口(interface)——有什么意义?

标签 c# .net interface

接口(interface)的原因真的让我难以理解。据我了解,这是一种解决 C# 中不存在的不存在的多重继承的方法(或者有人告诉我)。

我所看到的是,您预定义了一些成员和函数,然后必须在类中再次重新定义它们。从而使接口(interface)冗余。感觉就像句法……好吧,对我来说是垃圾(请不要冒犯我。垃圾就是无用的东西)。

在下面给出的示例中,取自堆栈溢出时的不同 C# 接口(interface)线程,我将只创建一个名为 Pizza 的基类而不是接口(interface)。

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

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
    }
}

最佳答案

没有人真正用通俗易懂的语言解释接口(interface)的用途,所以我要试一试(并从 Shamim 的回答中借鉴一点想法)。

让我们以披萨订购服务为例。您可以有多种类型的比萨饼,每个比萨饼的共同操作是在系统中准备订单。每个披萨都必须准备好,但每个披萨的准备方式都不同。例如,当订购夹馅披萨时,系统可能必须验证餐厅是否提供某些食材,并将那些不需要深盘披萨的食材放在一边。

当用代码编写时,技术上你可以这样做

public class Pizza
{
    public void Prepare(PizzaType tp)
    {
        switch (tp)
        {
            case PizzaType.StuffedCrust:
                // prepare stuffed crust ingredients in system
                break;
                
            case PizzaType.DeepDish:
                // prepare deep dish ingredients in system
                break;
                
            //.... etc.
        }
    }
}

但是,深盘比萨(在 C# 术语中)可能需要在 Prepare() 方法中设置不同于馅饼皮的属性,因此您最终会得到很多可选属性,并且该类不能很好地扩展(如果您添加新的披萨类型会怎样)。

解决这个问题的正确方法是使用接口(interface)。该接口(interface)声明可以准备所有 Pizza,但可以准备不同的 Pizza。所以如果你有以下接口(interface):

public interface IPizza
{
    void Prepare();
}

public class StuffedCrustPizza : IPizza
{
    public void Prepare()
    {
        // Set settings in system for stuffed crust preparations
    }
}

public class DeepDishPizza : IPizza
{
    public void Prepare()
    {
        // Set settings in system for deep dish preparations
    }
}

现在,您的订单处理代码无需准确了解订购的比萨饼类型即可处理配料。它只有:

public PreparePizzas(IList<IPizza> pizzas)
{
    foreach (IPizza pizza in pizzas)
        pizza.Prepare();
}

即使每种披萨的准备方式不同,这部分代码也不必关心我们处理的是什么类型的披萨,它只知道为披萨调用它,因此每次调用 Prepare 将根据其类型自动正确准备每个比萨,即使集合中有多种类型的比萨。

关于c# - 接口(interface)——有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6802573/

相关文章:

c# - 我什么时候会遇到C#中Double类型的问题(比特币的小数点后8位)?

.net - GUID 字符串可以用作 Windows 服务器上的文件夹名称吗

jquery - ASP.NET MVC 中的 JSON 返回格式

java - 我应该在哪里实现 ActionListener?

C#角色服装系统

c# - 从字符串开始的第二行开始 - 直到

c# - .NET 基本类型添加怪癖?

c# - Docebo - 构建授权 header

c# - DDD 逻辑和持久性无知

c++ - 具有纯虚方法的接口(interface)与类