当在一个现有的接口中添加新的成员时,会面临着兼容性问题,因为所有使用该接口的实现类都需要进行相应的修改。针对这种情况,C# 8推出了接口的默认实现方法的特性。通过默认实现方法,接口的作者可以为接口提供新功能,而无需破坏面向对象设计中的接口整体抽象性原则。
一、默认接口方法的定义
默认接口方法的定义与普通接口方法一致,不同的在于将其实现体嵌入在接口定义之中,并使用default
关键字声明:
interface IMyInterface
{
void MyMethod();
// 默认接口方法
default void DefaultMethod()
{
Console.WriteLine("这是一个默认接口方法...");
}
}
二、实现默认接口方法
生成的接口实现类可以使用默认接口方法,可以沿用接口定义中声明的所有方法。同时也可以重新实现默认接口方法。
public class MyClass : IMyInterface
{
public void MyMethod()
{
Console.WriteLine("实现了接口的抽象方法");
}
// 重新实现默认接口方法
public void DefaultMethod()
{
Console.WriteLine("这是重写的默认接口方法...");
}
}
注意: 只有实现的类可以重新实现接口中默认的接口方法。而直接继承该接口的子接口则不能重写或继承该接口的默认接口方法。
三、示例1:计算器类
下面用一个计算器的例子来说明默认接口方法的使用。首先定义一个ICalculator
接口,该接口包括了四个基本操作方法,并且在该接口中添加一个默认的方法DefaultValue()
:
public interface ICalculator
{
double Add(double a, double b);
double Subtract(double a, double b);
double Multiply(double a, double b);
double Divide(double a, double b);
// 默认接口方法,可忽略该方法的实现
default void DefaultMethod()
{
Console.WriteLine("这是默认接口方法");
}
}
接着,我们定义一个计算器类Calculator
,该类要实现ICalculator
接口,并重写DefaultValue()
方法,输出一个计算器的提示信息:
public class Calculator : ICalculator
{
public double Add(double a, double b)
{
return a + b;
}
public double Subtract(double a, double b)
{
return a - b;
}
public double Multiply(double a, double b)
{
return a * b;
}
public double Divide(double a, double b)
{
return a / b;
}
// 重新实现默认接口方法
public void DefaultMethod()
{
Console.WriteLine("这是一个计算器");
}
}
现在,我们可以愉快的在主函数中进行以下操作了:
Calculator calculator = new Calculator();
calculator.DefaultMethod();
double a = 8.0;
double b = 2.0;
Console.WriteLine("a + b = " + calculator.Add(a, b));
Console.WriteLine("a - b = " + calculator.Subtract(a, b));
Console.WriteLine("a * b = " + calculator.Multiply(a, b));
Console.WriteLine("a / b = " + calculator.Divide(a, b));
四、示例2:锁对象连接字符串
下面用一个更为简单的例子来解释默认接口方法的另一种使用场景: 将锁对象连接起来的字符串。我们先定义一个IStringConcatenate
接口,该接口包含字符串拼接的方法,且添加一个默认方法DefaultValue()
:
public interface IStringConcatenate
{
string Concatenate(string str1, string str2);
// 默认接口方法,可忽略该方法的实现
default void DefaultMethod()
{
Console.WriteLine("这是默认接口方法");
}
}
接着,我们定义一个字符串拼接类StringConcatenate
,该类要实现IStringConcatenate
接口,并重写DefaultValue()
方法,返回一个拼接锁对象的字符串:
public class StringConcatenate : IStringConcatenate
{
public string Concatenate(string str1, string str2)
{
lock(str1)
{
lock (str2)
{
return str1 + str2;
}
}
}
// 重新实现接口的默认方法
public void DefaultMethod()
{
Console.WriteLine("将传入的两个字符串锁对象连接到一起!");
}
}
完成类定义后,我们可以愉快的在主函数中进行以下操作了:
StringConcatenate strCon = new StringConcatenate();
string str1 = "World";
string str2 = "Hello";
Console.WriteLine(strCon.Concatenate(str1, str2));
strCon.DefaultMethod();
以上就是C# 8中默认接口方法的使用攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在C# 8中如何使用默认接口方法详解 - Python技术站