📜  C#|如何使用接口引用

📅  最后修改于: 2021-05-29 18:08:45             🧑  作者: Mango

在C#中,允许您创建接口类型的引用变量,换句话说,您可以创建接口引用变量。这种变量可以引用实现其接口的任何对象。接口参考变量仅知道由其接口声明所声明的方法。它不允许访问对象可能支持的任何其他变量或方法。当您使用父类引用访问子类对象时,此概念类似。

以下示例说明了接口引用的概念:

范例1:

// C# program to illustrate the 
// concept of Interface References
using System;
  
// interface declaration
public interface Race {
      
    // declaration of abstract methods of
    // interface that will be implemented 
    // by the class which inherits the interface
    void Speed(int s);
    void Distance(int d);
}
  
// class implementing interface
public class Person1 : Race {
      
    int sp1, di1;
      
    // abstract method of 
    // Race interface
    public void Speed(int p1s) {
          
        sp1 = p1s;
        Console.WriteLine("Speed Method implemented by Person1");
          
    }
      
    // abstract method of 
    // Race interface
    public void Distance(int p1d) {
          
        di1 = p1d;
        Console.WriteLine("Distance Method implemented by Person1");
          
    }
      
    // method of class Person1
    public void display1() {
          
        Console.WriteLine("The Speed of 1st person is: "+sp1);
        Console.WriteLine("The distance covered by 1st person is: "+di1);
          
    }
      
}
  
// class implementing interface
public class Person2 : Race {
      
    int sp2, di2;
      
    // abstract method of 
    // Race interface
    public void Speed(int p2s) {
          
        sp2 = p2s;
        Console.WriteLine("Speed Method implemented by Person2");
          
    }
      
    // abstract method of 
    // Race interface
    public void Distance(int p2d) {
          
        di2 = p2d;
        Console.WriteLine("Distance Method implemented by Person2");
          
    }
      
    // method of class Person2
    public void display2() {
          
        Console.WriteLine("The Speed of 2nd person is: "+sp2);
        Console.WriteLine("The distance covered by 2nd person is: "+di2);
          
    }
      
}
  
// Driver Class
public class GFG {
      
    // Main method
    public static void Main(String []args) {
          
        // creating an instance of Person1 class
        Person1 obj1 = new Person1();
          
        // creating an instance of Person2 class
        Person2 obj2 = new Person2();
          
        // creating an Reference 
        // of interface Race
        Race r;
          
        // ----- For Person1 Class ----------
          
        // assigning Person1 object 'obj1'
        // to interface Reference 'r'
        r = obj1;
          
        // Now you can access the abstract method
        // of Race interface which are implemented
        // by class Person1
        r.Speed(10);
        r.Distance(50);
  
        // if you will try to call display1() 
        // method using 'r' it will give error
        //r.display1();
          
        // calling the display1() 
        // method of Person1 Class
        obj1.display1();
          
        // ----- For Person2 Class ----------
          
        // assigning Person2 object 'obj2'
        // to interface Reference 'r'
        r = obj2;
          
        // Now you can access the abstract method
        // of Race interface which are implemented
        // by class Person2
        r.Speed(15);
        r.Distance(45);
  
        // if you will try to call display2() 
        // method using 'r' it will give error
        //r.display2();
          
        // calling the display1() 
        // method of Person1 Class
        obj2.display2();
          
    }
      
}
输出:
Speed Method implemented by Person1
Distance Method implemented by Person1
The Speed of 1st person is: 10
The distance covered by 1st person is: 50
Speed Method implemented by Person2
Distance Method implemented by Person2
The Speed of 2nd person is: 15
The distance covered by 2nd person is: 45

说明:在上面的示例中,我们有一个名为Race的接口,两个类Person1Person2正在实现该接口的方法。 Person1类具有自己的名为display1()的方法,类似的Person2类具有其自己的方法display2() ,无法使用接口引用来调用它。为了使用接口引用(这里r是接口引用)来调用方法,您必须为其分配一个class对象。就像您将Person1的对象obj1分配给r一样,r = obj1;然后调用Person1类实现的Speed()Distance()方法。为了调用display1()方法,必须使用obj1。类似地使用r = obj2;我们正在调用Person2类的方法。

范例2:

// C# program to illustrate the 
// concept of Interface References
using System;
  
// interface declaration
interface Vehicle {
  
    // all are the abstract methods.
    void changeGear(int a);
    void speedUp(int a);
    void applyBrakes(int a);
    void printStates();
}
  
// class implements interface
class Bicycle : Vehicle {
  
    int speed;
    int gear;
  
    // to change gear
    public void changeGear(int newGear)
    {
  
        gear = newGear;
    }
  
    // to increase speed
    public void speedUp(int increment)
    {
  
        speed = speed + increment;
    }
  
    // to decrease speed
    public void applyBrakes(int decrement)
    {
  
        speed = speed - decrement;
    }
  
    public void printStates()
    {
        Console.WriteLine("speed: " + speed + " gear: " + gear);
    }
}
  
// Driver Class
class GFG {
  
    // Main Method
    public static void Main(String[] args)
    {
  
        // creating an instance of Bicycle
        Bicycle bicycle = new Bicycle();
  
        // Creating interface references
        Vehicle obj;
  
        // assigning Bicycle object 'bicycle'
        // to interface Reference 'obj'
        obj = bicycle;
  
        // calling the abstract methods 
        // implemented by class Bicycle
        obj.changeGear(4);
        obj.speedUp(5);
        obj.applyBrakes(2);
  
        Console.WriteLine("Bicycle Present State:");
  
        // calling the method of class Bicycle 
        obj.printStates();
    }
}
输出:
Bicycle Present State:
speed: 3 gear: 4

说明:在上面的示例中,Vehicle是一个接口,Bicycle类实现了此接口。此处obj在Main()方法中声明为对Vehicle接口的引用。现在,此obj用于引用Bicycle类的对象Bicycle。