在c#中类的继承无法多重继承,但是可以继承多个接口.下面介绍一个C#中接口简单的使用案例.
假设我们编写了一个用于科学计算的DLL组件(ProgramA),在另外的项目ProgramB中调用这个组件.
因为ProgramA是个耗时计算,并且会根据输入信息报错,因此我们希望ProgramA在计算过程中传递一些消息报告计算的详细进度.显示在ProgramB界面上
ProgramA的DLL在计算过程中,怎么把计算过程中消息传递给ProgramB呢?下面使用接口来实现:
首先ProgramA中写一个接口,定义了两个功能,传递消息和传递进度
public interface IMsgCenter
{
Task ShowMessage(string msg);
Task ShowProcess(double process);
}
然后在A的主程序,需要进行消息输出的的类中加入一个MsgCenter属性
public class Main
{
public Main() { }
//根据接口定义一个属性
public static IMsgCenter MsgCenter { get; set; }
.......
}
同时在A的主程序中,需要进行消息输出的地方进行调用
MsgCenter.ShowMessage("我是用来测试的字符串");
ProgramA只定义了接口并调用了接口中的方法,但没有定义接口的具体实现.
接口实现在ProgramB的程序中.假设这是一个Winform程序,在后台代码中实现IMsgCenter接口.
public partial class Form1 : Form,IMsgCenter
{
public Task ShowMessage(string msg)
{
DebugTextBox.AppendText("\n" +msg + "\n");
return null;
}
public Task ShowProcess(double process)
{
throw new NotImplementedException();
}
}
其中DebugTextBox是winform的一个TextBox控件,也就是通过上面的代码定义了接口的实现,将消息Msg写到TextBox控件里面.
最后一步:虽然Form1实现了IMsgCenter接口,但ProgramA中的属性MsgCenter还是空的,在Form1类中加入
//Main为dll主程序类 Main m = new Main(); //将Main的MsgCenter属性设置为自己 Main.MsgCenter = this;在调用Dll计算之前加入,这样DLL中消息的输出就都可以显示在ProgramB界面上了.
这个案例中,ProgramA中之定义接口而没有定义接口的具体实现,具体实现是ProgramB的设计者所需要考虑的事情.
使用接口实现多重继承:
接口 InterfaceA,InterfaceB
类 ClassA实现接口A功能,定义具体实现
类 ClassB实现接口B功能,定义具体实现
类 主程序类ClassC 定义两个属性PropertyM,PropertyN
这个两个属性分别是实例化的ClassA和ClassB,在ClassC中调用A,B属性的的方法即可.
达到的效果和多重继承是一样的,并且使用接口使得条理更清晰,容易管理.
这就是开发中非常实用的C#接口使用经典案例