📜  C# 中的委托与接口(1)

📅  最后修改于: 2023-12-03 15:13:50.139000             🧑  作者: Mango

C# 中的委托与接口

委托和接口是 C# 中重要的概念,它们提供了一种将方法视为对象的方式,使得代码具有更高的灵活性和可复用性。

什么是委托?

委托是一种类型,它可以存储对特定方法的引用,也可以将该引用传递给其他方法。这与函数指针的概念类似。

声明和使用委托

在 C# 中,委托使用 delegate 关键字声明,类似于以下代码:

public delegate void MyDelegate(int param);

这定义了一个名为 MyDelegate 的委托类型,它可以引用一个参数为整数的方法并且不返回任何值。

要使用这个委托,可以先创建一个类或结构体,其中包含一个方法,该方法和委托类型的结构一样。例如:

public class MyClass
{
    public void MyMethod(int param)
    {
        Console.WriteLine(param);
    }
}

然后可以创建一个委托实例,并使用 += 运算符将这个方法的引用添加到委托实例中:

MyDelegate myDelegate = new MyDelegate(new MyClass().MyMethod);
myDelegate(123); // 输出 123

在这里,我们创建了一个委托实例 myDelegate,它可以引用一个参数为整数的方法。我们将 MyMethod 方法的引用传递给了它,并使用 123 作为参数调用了这个委托实例。

触发委托

可以使用委托实例来触发它所引用的方法。委托实例可以使用 () 运算符来调用,类似于以下代码:

myDelegate(456); // 输出 456

此时,将使用 456 作为参数调用 MyMethod 方法。

多重委托

在 C# 中,一个委托可以引用多个方法。这些方法将按照它们添加到委托实例的顺序依次调用。这称为多重委托。

可以使用 + 运算符将多个方法的引用添加到同一个委托实例中,也可以使用 - 运算符将一个方法的引用从委托实例中移除。例如:

MyDelegate myDelegate = new MyClass().MyMethod;
myDelegate += new MyClass().MyMethod;
myDelegate += new MyClass().MyMethod;
myDelegate -= new MyClass().MyMethod;
myDelegate(789); // 输出 789 789

在这里,我们创建了一个委托实例 myDelegate,它引用了 MyMethod 方法。然后,我们使用 + 运算符将它又添加了两次,最终将它从委托实例中移除了一次。我们使用 789 作为参数调用了这个委托实例,因此 MyMethod 方法将被调用两次,输出 789 两次。

泛型委托

C# 2.0 引入了泛型委托的概念,它可以更好地支持类型安全和可读性。可以定义一个泛型委托,就像以下代码一样:

public delegate void MyGenericDelegate<T>(T param);

这定义了一个名为 MyGenericDelegate 的泛型委托类型,它可以引用一个参数类型为 T 的方法并且不返回任何值。

什么是接口?

接口是一种抽象类型,它可以定义一组方法、属性和事件,但不提供它们的实现。这使得不同的类可以实现相同的接口,每个类都可以根据自己的需求提供自己的实现。这种多态性可以使代码具有更高的灵活性和可复用性。

声明和使用接口

在 C# 中,接口使用 interface 关键字声明,类似于以下代码:

public interface IMyInterface
{
    void MyMethod(int param);
}

这定义了一个名为 IMyInterface 的接口类型,它包含一个名为 MyMethod 的方法,该方法传递一个参数 param 并且不返回任何值。

要实现这个接口,可以创建一个类或结构体,并使用 : 运算符指定它实现的接口。在实现中,需要提供每个接口成员的实现。例如:

public class MyClass : IMyInterface
{
    public void MyMethod(int param)
    {
        Console.WriteLine(param);
    }
}

在这里,我们创建了一个 MyClass 类,并使用 : 运算符指定它实现的 IMyInterface 接口。我们提供了 MyMethod 方法的实现,它打印出传递的参数。

现在,可以创建一个 IMyInterface 类型的变量,并将它初始化为 MyClass 的实例。然后可以使用这个变量来调用 MyMethod 方法,类似于以下代码:

IMyInterface myInterface = new MyClass();
myInterface.MyMethod(123); // 输出 123

在这里,我们创建了一个 myInterface 变量,并将它初始化为 MyClass 的实例。我们调用了 MyMethod 方法,并传递了 123 作为参数,得到了相应的输出。

多重接口

一个类可以实现多个接口,这样它可以使用每个接口所定义的方法、属性和事件。多个接口之间可以使用逗号分隔列出,类似于以下代码:

public class MyClass : IMyInterface1, IMyInterface2
{
    // 实现 IMyInterface1 和 IMyInterface2 中定义的所有成员
}

在这里,我们创建了一个 MyClass 类,并使用 , 运算符指定它实现的两个接口 IMyInterface1IMyInterface2

接口继承

接口可以继承其他接口,这意味着一个接口可以包含其他接口的所有成员,以及它自己的成员。继承的接口可以嵌套定义,例如:

public interface IMyInterface1
{
    void MyMethod1(int param);
}

public interface IMyInterface2 : IMyInterface1
{
    void MyMethod2(string param);
}

在这里,我们定义了 IMyInterface1IMyInterface2 两个接口,IMyInterface2 继承了 IMyInterface1IMyInterface2 中定义了两个方法 MyMethod1MyMethod2

现在,可以创建一个 IMyInterface2 类型的变量,并将它初始化为实现 IMyInterface2 接口的类的实例。然后可以使用这个变量来调用 MyMethod1MyMethod2 方法,类似于以下代码:

IMyInterface2 myInterface2 = new MyClass();
myInterface2.MyMethod1(123); // 输出 123
myInterface2.MyMethod2("abc"); // 输出 abc

在这里,我们创建了一个 myInterface2 变量,并将它初始化为实现 IMyInterface2 接口的类的实例。我们调用了 MyMethod1MyMethod2 方法,得到了相应的输出。

总结

在本篇文章中,我们介绍了 C# 中的委托和接口。它们可以使代码具有更高的灵活性和可复用性,使得多个类可以相互交互和使用。委托和接口也是 C# 中一些高级概念的基础,如事件和泛型。如果你想写出更好的 C# 代码,建议深入学习委托和接口的概念。