多个接口出现同名函数的处理(C#,Delphi)
如果一个类调用多个接口,且多个接口中有同名的函数,我们知道,如果类要继承一个接口,就必须要实现接口中的所有函数,怎么办?
C#的处理原则是:
在类中要分别实现每个接口及其函数,函数名前要加上接口的名称(前面的访问修饰符不用加,因为都是public).在调用此类中函数时,要把类别成对应的接口再调用接口对应的函数。
如下代码图:
1.两个接口
public interface inter1 { void setname(string sname); string getname(); } public interface inter2 { void setname(string sname); string getname(); }
2.创建类并实现以上两个接口
public class Myclass : Object, inter1, inter2 { private string name=""; void inter1.setname(string sname) { MessageBox.Show("Set inter1 name"); name = sname; } void inter2.setname(string sname) { MessageBox.Show("Set inter2 name"); name = sname; } string inter1.getname() { MessageBox.Show("Get inter1 name"); return name; } string inter2.getname() { MessageBox.Show("Get inter2 name"); return name; } }
3.调用以上类的相关函数
private void button1_Click(object sender, EventArgs e) { Myclass myclass=new Myclass(); inter1 i1 = (inter1)myclass;//强制类型转换 i1.setname("vvv"); inter2 i2 = (inter2)myclass;//强制类型转换 i2.getname(); }
Delphi的处理原则是:
给同名的函数分别设置别名,再分别实现以别名为名句的函数,以后类在调用时就是别名即可。
代码如下:
1.声明接口
type IInter1=interface ['{769D95CA-90CE-41BA-A195-A6F43A30A3FC}'] function getname:string; procedure setname(sname:string); end; IInter2=interface ['{1CE978B4-F7AC-44B1-9EAD-5B8CCE1510A1}'] function getname:string; procedure setname(sname:string); end;
2.创建类
声明部分
type TMyClass=class(TInterfacedobject,IInter1,IInter2) private FName:string; public { DONE : 设定别名 } function IInter1.getName=Inter1_getname; function IInter2.getName=Inter2_getname; procedure IInter1.setname=Inter1_setname; procedure IInter2.setname=Inter2_setname; { DONE : 重新命名 } function Inter1_getname:string; function Inter2_getname:string; procedure Inter1_setname(sname:string); procedure Inter2_setname(sname:string); { DONE : 析构 } destructor destroy;override; end;
实现部分
{ TMyClass } destructor TMyClass.destroy; begin MessageDlg('exit object',mtinformation,[mbok],0); inherited; end; function TMyClass.Inter1_getname: string; begin MessageDlg('get inter1 name',mtinformation,[mbok],0); Result:=FName; end; procedure TMyClass.Inter1_setname(sname: string); begin MessageDlg('set inter1 name',mtinformation,[mbok],0); FName:=sname; end; function TMyClass.Inter2_getname: string; begin MessageDlg('get inter2 name',mtinformation,[mbok],0); Result:=FName; end; procedure TMyClass.Inter2_setname(sname: string); begin MessageDlg('set inter2 name',mtinformation,[mbok],0); FName:=sname; end;
3.调用以上类中的函数:
procedure TForm1.Button1Click(Sender: TObject); begin myclass:=TMyClass.Create; try myclass.Inter1_setname('88'); ShowMessage(myclass.Inter2_getname); finally myclass.Free; end; end;