zoukankan      html  css  js  c++  java
  • 多个接口出现同名函数的处理(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;
  • 相关阅读:
    接口和实现接口的类
    类的封装
    实验六:类的封装
    实验五:任意输入10个int类型数据,排序输出,再找出素数
    实验四:采用一维数组输出等腰三角形的杨辉三角
    2017-12-31 小组工作记录
    2017-12-30 小组工作记录
    2017-12-29 小组工作记录
    2017-12-24 小组工作记录
    2017-12-21 小组工作记录
  • 原文地址:https://www.cnblogs.com/yagzh2000/p/2859378.html
Copyright © 2011-2022 走看看