1. 程式人生 > 程式設計 >詳解C#中對於介面的實現方式(隱式介面和顯式介面)

詳解C#中對於介面的實現方式(隱式介面和顯式介面)

C#中對於介面的實現方式有隱式介面和顯式介面兩種:

隱式地實現介面成員

建立一個介面,IChinese,包含一個成員 Speak;我們建立一個類Speaker,實現介面Chinese

//隱藏式實現例子
public interface IChinese
{
  string Speak();
}
public class Speaker : IChinese
{
  public string Speak()
  {
    return "中文";
  }
}

這個就是隱式實現介面。

隱式實現呼叫方法如下:

IChinese s = new Speaker();
s.Speak();

Speaker s = new Speaker();
s.Speak();

都可以呼叫Speak這個方法。

建立一個介面,IEnglish,包含一個成員 Speak;讓我們的類Speaker來實現介面IEnglish

//顯式實現例子
public interface IEnglish
{
  string Speak();
}
public class Speaker : IEnglish
{
   string English.Speak()
  {
    return "English";
  }
}

通過這種顯示介面實現。Speak方法就只能通過介面來呼叫:

IEnglish s = new Speaker();
s.Speak(); 

下面的這種方式將會編譯錯誤:

Speaker s = new Speaker();
s.Speak(); 

隱式實現和顯示實現的區別:

一、語法的區別

1、隱式方式Speaker的成員(Speak)實現有而且必須有自己的訪問修飾符(public),顯示實現方式Speaker的成員(Speak)不能有任何的訪問修飾符。
2、顯示實現方式Speaker使用介面名稱和一個句點命名該類成員(Speak)來實現的:English.Speak();也就是

二、呼叫的區別

隱式介面實現的呼叫,注意類的宣告,可以用介面宣告,也可以用實現類 Speaker宣告。呼叫者都可以得到呼叫例項化物件的行為Speak;

class Program
{
  static void Main(string[] args)
  {
    IChinese s = new Speaker();
    s.Speak();
    Speaker s = new Speaker();
    s.Speak();
  }
} 

顯式介面實現呼叫,注意類的宣告,只可以用介面宣告,呼叫者才可以可以得到呼叫例項化物件的行為Speak;

class Program
{
    static void Main(string[] args)
    {
      IEnglish s = new Speaker();
      s.Speak();
      //下面寫法將引起編譯錯誤錯誤“PetShop.Speaker”不包含“Speak”的定義;
      // Speaker s = new Speaker();
      // s.Speak();
    }
}

結論:

隱示實現物件宣告為介面和類都可以訪問到其行為,顯示實現只有宣告為介面可以訪問。

如果兩個介面中有相同的方法名,那麼同時實現這兩個介面的類,就會出現不確定的情形,在編寫方法時,也不知道實現哪個介面的方法了。為解決這一問題,C#提供了顯示介面實現技術,就是在方法名前加介面名稱,用介面名稱來限定成員。用“介面名.方法名()”來區分實現的是哪一個介面。

注意:顯示介面實現時,在方法名前不能加任何訪問修飾符。這種方式和普通方法不同,普通方法前不加訪問修飾符,預設為私有的,而顯式介面實現時方法前不加任何修飾符,預設為公有的,如果前面加上修飾符,會出現編譯錯誤。

呼叫顯示介面實現的正確方式是通過介面引用,通過介面引用來確定要呼叫的版本。

下面我們看一下完整例項:

using System;
public interface IPerson
{
  string Name
  {
    get;
    set;
  }
  void Show(string name);
}

public interface IStudent
{
  string StudentId
  {
    get;
    set;
  }
  void Show(string studentid);
}

public class Student: IPerson,IStudent
{
  private string _name;
  public string Name
  {
    get
    {
     return _name;
    }
    set
    {
     _name = value;
    }
  }

  private string _studentid;
  public string StudentId
  {
    get
    {
     return _studentid;
    }
    set
    {
     _studentid = value;
    }
  }

  void IPerson.Show(string name)
  {
    Console.WriteLine("姓名為{0}",name);
  }

  void IStudent.Show(string studentid)
  {
    Console.WriteLine("學號為{0}",studentid);
  }
}

class Program
{
  static void Main()
  {
    Student s = new Student();
    Console.WriteLine("輸入姓名");
    s.Name = Console.ReadLine();
    Console.WriteLine("輸入學號");
    s.StudentId = Console.ReadLine();
    IPerson per = s;
    per.Show(s.Name);
    IStudent stu = s;
    stu.Show(s.StudentId);
  }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。