C#:使用接口和委托

发布日期:2026-07-12 03:48:02   来源 : 杭州电子商务研究院    浏览量 :7
杭州电子商务研究院 发布日期:2026-07-12 03:48:02  
7

介绍

您是否遇到过包含大量 if-else 逻辑的代码?大多数情况下,当我们看到这种逻辑时,这是一个策略问题。有人试图使用最原始的语言工具“if”语句来解决问题。

然而,当谈到面向对象编程时,重要的是要理解代码需要可重用、可测试和可扩展。这就是策略模式派上用场的地方。让我们看一个例子。(示例是 C# 语言,但该概念可应用于任何面向对象语言)

首先,我们将看到用简单的“if”语句编写的代码。

      public int Calculate(int x, int y)
{
	if(action == "Add")
    {
    	return x+y;
    }
    else if(action == "Sub")
    {
    	return x-y;
    }
    else if
      ......
      .... and so on.
}
    

然而,这种方法存在问题:

  1. 如果要添加另一个策略(比如说除法),则必须更改类中的代码,从而修改类本身。然而,这不是一个好的做法。它违反了 OCP(开放封闭原则)的原则。OCP 表示类可以扩展,但不能修改。

  2. 后面有太多“如果”阻碍。

  3. 硬编码字符串。我确信没人想要它们。作为计数器,我们可以使用枚举。然而,当存在更快的方法时,这会增加另一个依赖项。

  4. 删除一个策略非常耗时。

策略模式

现在让我们使用策略模式 - 这是一种允许您即时选择策略的模式。策略取决于对象的类型。此模式背后的原则是“针对接口编程,而不是针对实现编程”。这使得最终的解决方案易于测试、扩展和维护。

我们首先定义接口。

      public interface ICalculate
{
	 int Calculate(int x, int y);
}
    

现在我们可以实现这个接口了。

      public class Add : ICalculate
{
    #region ICalculate Members

    public int Calculate(int x, int y)
    {
        return x + y;
    }

    #endregion
}

public class Subtract : ICalculate
{
    #region ICalculate Members

    public int Calculate(int x, int y)
    {
        return x - y;
    }

    #endregion
}
    

这就是我们所说的代码。

      ICalculate calculate = new Add(); int sum = calculate.Calculate(a , b);
    

由于对象属于Add类型,我们无需检查类型(如上文所述)即可调用相应函数。因此,在运行时,将调用Add类中的Calculate方法。

如何添加新的策略?这就像添加另一个类一样简单。我们只需要确保它实现接口。让我们创建一个名为Multiply 的新策略,该策略实现ICalculate

      public class Multiply : ICalculate
{
    #region ICalculate Members

    public int Calculate(int num1, int num2)
    {
        return num1 * num2;
    }

    #endregion
}
    

一些观察:

  1. 这个例子并不违反 OCP。事实上,它支持 OCP,因为我们不修改特定的类;我们的策略是创建一个具有特定定义功能的新类。

  2. 如果我们需要删除一个策略,我们可以从代码中删除该类,并且它不会影响任何其他代码(就像在遗留代码中一样 - 我们必须删除那个 if-else 语句)。

  3. 它没有硬编码字符串。

使用委托的编码策略模式?

使用委托的编码策略模式非常简单。

      public class Calculator
{
    public static int Add(int x, int y)
    {
        return x + y;
    }

    public static int Subtract(int x, int y)
    {
        return x - y;
    }

    public static int Multiply(int x, int y)
    {
        return x * y;
    }

    public static int Divide(int x, int y)
    {
        return x / y;
    }
}
    

现在,我们可以使用委托来调用此代码。

      Func calculate = Calculator.Add;
int sum = calculate(100, 50);
    

或者

      calculate = Calculator.Subtract;
int difference = calculate(100, 50);
    

这行代码是不是太多了?好吧,既然如此,我们可以直接用内联方式编写该方法。现在,我们不需要 Calculator 类了。

      Func calculate;
calculate = (x, s) => x + s;
    

结论

委托和接口之间的主要区别在于,虽然委托可以减少代码量并提高代码的可读性,但您必须小心使用它们,否则最终可能会牺牲可测试性。即使需要更多代码,使用接口进行编码通常也更可靠。

以上内容来自杭州电子商务研究院推送
关注
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据