📅  最后修改于: 2023-12-03 15:13:50.139000             🧑  作者: Mango
委托和接口是 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
类,并使用 ,
运算符指定它实现的两个接口 IMyInterface1
和 IMyInterface2
。
接口可以继承其他接口,这意味着一个接口可以包含其他接口的所有成员,以及它自己的成员。继承的接口可以嵌套定义,例如:
public interface IMyInterface1
{
void MyMethod1(int param);
}
public interface IMyInterface2 : IMyInterface1
{
void MyMethod2(string param);
}
在这里,我们定义了 IMyInterface1
和 IMyInterface2
两个接口,IMyInterface2
继承了 IMyInterface1
。IMyInterface2
中定义了两个方法 MyMethod1
和 MyMethod2
。
现在,可以创建一个 IMyInterface2
类型的变量,并将它初始化为实现 IMyInterface2
接口的类的实例。然后可以使用这个变量来调用 MyMethod1
和 MyMethod2
方法,类似于以下代码:
IMyInterface2 myInterface2 = new MyClass();
myInterface2.MyMethod1(123); // 输出 123
myInterface2.MyMethod2("abc"); // 输出 abc
在这里,我们创建了一个 myInterface2
变量,并将它初始化为实现 IMyInterface2
接口的类的实例。我们调用了 MyMethod1
和 MyMethod2
方法,得到了相应的输出。
在本篇文章中,我们介绍了 C# 中的委托和接口。它们可以使代码具有更高的灵活性和可复用性,使得多个类可以相互交互和使用。委托和接口也是 C# 中一些高级概念的基础,如事件和泛型。如果你想写出更好的 C# 代码,建议深入学习委托和接口的概念。