欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解C#中的接口屬性以及屬性訪問器的訪問限制

 更新時間:2016年01月30日 15:18:33   投稿:goldensun  
這篇文章主要介紹了詳解C#中的接口屬性以及屬性訪問器的訪問限制,文中講到了使用訪問器實現(xiàn)接口時添加訪問修飾符的問題,需要的朋友可以參考下

接口屬性
可以在接口上聲明屬性。以下是接口索引器訪問器的示例:

public interface ISampleInterface
{
  // Property declaration:
  string Name
  {
    get;
    set;
  }
}

接口屬性的訪問器不具有體。因此,訪問器的用途是指示屬性是否為讀寫、只讀或只寫。
在此例中,接口 IEmployee 具有讀寫屬性 Name 和只讀屬性 Counter。 Employee 類實現(xiàn) IEmployee 接口并使用這兩種屬性。程序讀取新雇員的姓名和雇員的當前編號,并顯示雇員姓名和計算所得的雇員編號。
可以使用屬性的完全限定名,它引用聲明成員的接口。例如:

string IEmployee.Name
{
  get { return "Employee Name"; }
  set { }
}

這稱為顯式接口實現(xiàn)(C# 編程指南)。例如,如果 Employee 類實現(xiàn)兩個接口 ICitizen 和 IEmployee,并且兩個接口都具有 Name 屬性,則需要顯式接口成員實現(xiàn)。即,如下屬性聲明:

string IEmployee.Name
{
  get { return "Employee Name"; }
  set { }
}

在 IEmployee 接口上實現(xiàn) Name 屬性,而下面的聲明:

string ICitizen.Name
{
  get { return "Citizen Name"; }
  set { }
}

在 ICitizen 接口上實現(xiàn) Name 屬性。

interface IEmployee
{
  string Name
  {
    get;
    set;
  }

  int Counter
  {
    get;
  }
}

public class Employee : IEmployee
{
  public static int numberOfEmployees;

  private string name;
  public string Name // read-write instance property
  {
    get
    {
      return name;
    }
    set
    {
      name = value;
    }
  }

  private int counter;
  public int Counter // read-only instance property
  {
    get
    {
      return counter;
    }
  }

  public Employee() // constructor
  {
    counter = ++counter + numberOfEmployees;
  }
}

class TestEmployee
{
  static void Main()
  {
    System.Console.Write("Enter number of employees: ");
    Employee.numberOfEmployees = int.Parse(System.Console.ReadLine());

    Employee e1 = new Employee();
    System.Console.Write("Enter the name of the new employee: ");
    e1.Name = System.Console.ReadLine();

    System.Console.WriteLine("The employee information:");
    System.Console.WriteLine("Employee number: {0}", e1.Counter);
    System.Console.WriteLine("Employee name: {0}", e1.Name);
  }
}

比如這里我們輸入:

210
Hazem Abolrous

則示例輸出

Enter number of employees: 210
Enter the name of the new employee: Hazem Abolrous
The employee information:
Employee number: 211
Employee name: Hazem Abolrous

限制訪問器可訪問性
屬性或索引器的 get 和 set 部分稱為“訪問器”。默認情況下,這些訪問器具有相同的可見性或訪問級別:其所屬屬性或索引器的可見性或訪問級別。不過,有時限制對其中某個訪問器的訪問會很有用。通常是在保持 get 訪問器可公開訪問的情況下,限制 set 訪問器的可訪問性。例如:

private string name = "Hello";

public string Name
{
  get
  {
    return name;
  }
  protected set
  {
    name = value;
  }
}

在此示例中,名為 Name 的屬性定義了一個 get 訪問器和一個 set 訪問器。 get 訪問器接受該屬性本身的可訪問性級別(在此示例中為 public),而對于 set 訪問器,則通過對該訪問器本身應用 protected 訪問修飾符來進行顯式限制。
對訪問器的訪問修飾符的限制
對屬性或索引器使用訪問修飾符受以下條件的制約:
不能對接口或顯式接口成員實現(xiàn)使用訪問器修飾符。
僅當屬性或索引器同時具有 set 和 get 訪問器時,才能使用訪問器修飾符。這種情況下,只允許對其中一個訪問器使用修飾符。
如果屬性或索引器具有 override 修飾符,則訪問器修飾符必須與重寫的訪問器的訪問器(如果有的話)匹配。
訪問器的可訪問性級別必須比屬性或索引器本身的可訪問性級別具有更嚴格的限制。
重寫訪問器的訪問修飾符
在重寫屬性或索引器時,被重寫的訪問器對重寫代碼而言,必須是可訪問的。此外,屬性/索引器和訪問器的可訪問性級別都必須與相應的被重寫屬性/索引器和訪問器匹配。例如:

public class Parent
{
  public virtual int TestProperty
  {
    // Notice the accessor accessibility level.
    protected set { }

    // No access modifier is used here.
    get { return 0; }
  }
}
public class Kid : Parent
{
  public override int TestProperty
  {
    // Use the same accessibility level as in the overridden accessor.
    protected set { }

    // Cannot use access modifier here.
    get { return 0; }
  }
}

實現(xiàn)接口
使用訪問器實現(xiàn)接口時,訪問器不能具有訪問修飾符。但是,如果使用一個訪問器(如 get)實現(xiàn)接口,則另一個訪問器可以具有訪問修飾符,如下面的示例所示:

public interface ISomeInterface
{
  int TestProperty
  {
    // No access modifier allowed here
    // because this is an interface.
    get;
  }
}

public class TestClass : ISomeInterface
{
  public int TestProperty
  {
    // Cannot use access modifier here because
    // this is an interface implementation.
    get { return 10; }

    // Interface property does not have set accessor,
    // so access modifier is allowed.
    protected set { }
  }
}

訪問器可訪問性域
如果對訪問器使用訪問某個修飾符,則訪問器的可訪問性域由該修飾符確定。
如果不對訪問器使用訪問修飾符,則訪問器的可訪問性域由屬性或索引器的可訪問性級別確定。
下面的示例包含三個類:BaseClass、DerivedClass 和 MainClass。每個類的 BaseClass、Name 和 Id 都有兩個屬性。該示例演示在使用限制性訪問修飾符(如 protected 或 private)時,如何通過 BaseClass 的 Id 屬性隱藏 DerivedClass 的 Id 屬性。因此,向該屬性賦值時,將調用 BaseClass 類中的屬性。將訪問修飾符替換為 public 將使該屬性可訪問。
該示例還演示 DerivedClass 的 Name 屬性的 set 訪問器上的限制性訪問修飾符(如 private 或 protected)如何防止對該訪問器的訪問,并在向它賦值時生成錯誤。

public class BaseClass
{
  private string name = "Name-BaseClass";
  private string id = "ID-BaseClass";

  public string Name
  {
    get { return name; }
    set { }
  }

  public string Id
  {
    get { return id; }
    set { }
  }
}

public class DerivedClass : BaseClass
{
  private string name = "Name-DerivedClass";
  private string id = "ID-DerivedClass";

  new public string Name
  {
    get
    {
      return name;
    }

    // Using "protected" would make the set accessor not accessible. 
    set
    {
      name = value;
    }
  }

  // Using private on the following property hides it in the Main Class.
  // Any assignment to the property will use Id in BaseClass.
  new private string Id
  {
    get
    {
      return id;
    }
    set
    {
      id = value;
    }
  }
}

class MainClass
{
  static void Main()
  {
    BaseClass b1 = new BaseClass();
    DerivedClass d1 = new DerivedClass();

    b1.Name = "Mary";
    d1.Name = "John";

    b1.Id = "Mary123";
    d1.Id = "John123"; // The BaseClass.Id property is called.

    System.Console.WriteLine("Base: {0}, {1}", b1.Name, b1.Id);
    System.Console.WriteLine("Derived: {0}, {1}", d1.Name, d1.Id);

    // Keep the console window open in debug mode.
    System.Console.WriteLine("Press any key to exit.");
    System.Console.ReadKey();
  }
}

輸出:

  Base: Name-BaseClass, ID-BaseClass
  Derived: John, ID-BaseClass

相關文章

  • 兩路歸并的數(shù)組與鏈表的實現(xiàn)方法

    兩路歸并的數(shù)組與鏈表的實現(xiàn)方法

    本篇文章對兩路歸并的數(shù)組與鏈表的實現(xiàn)方法進行了分析介紹。需要的朋友參考下
    2013-05-05
  • C#多線程之線程控制詳解

    C#多線程之線程控制詳解

    這篇文章主要為大家詳細介紹了C#多線程之線程控制的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • C#中的委托、事件學習筆記

    C#中的委托、事件學習筆記

    這篇文章主要介紹了C#中的委托、事件學習筆記,本文講解了委托delegate、事件的相關知識并給出代碼實例,需要的朋友可以參考下
    2015-01-01
  • C# Winform實現(xiàn)導入和導出Excel文件

    C# Winform實現(xiàn)導入和導出Excel文件

    這篇文章主要為大家詳細介紹了C# Winform實現(xiàn)導入和導出Excel文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C#中is與As運算符號的使用詳解

    C#中is與As運算符號的使用詳解

    本篇文章是對C#中is與As運算符號的使用進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • C#中的Linq?To?XML講解

    C#中的Linq?To?XML講解

    本文詳細講解了C#中的Linq?To?XML,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C#網(wǎng)頁跳轉方法總結

    C#網(wǎng)頁跳轉方法總結

    這篇文章主要介紹了C#網(wǎng)頁跳轉方法總結的相關資料,需要的朋友可以參考下
    2015-12-12
  • C#連接Oracle數(shù)據(jù)庫的多種方法總結

    C#連接Oracle數(shù)據(jù)庫的多種方法總結

    最近小項目當中要使用C#來連接Oracle數(shù)據(jù)庫來完成系統(tǒng)的操作,這篇文章主要給大家介紹了關于C#連接Oracle數(shù)據(jù)庫的多種方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-04-04
  • 詳解WPF如何在基礎控件上顯示Loading等待動畫

    詳解WPF如何在基礎控件上顯示Loading等待動畫

    這篇文章主要為大家詳細介紹了WPF如何在基礎控件上顯示Loading等待動畫的效果,文中的示例代碼講解詳細,具有一定的學習價值,需要的可以參考一下
    2023-04-04
  • C#讀寫文本文件(.txt)的方法實例

    C#讀寫文本文件(.txt)的方法實例

    讀寫文本文件其實是件很簡單的事情,這篇文章主要給大家介紹了關于C#讀寫文本文件(.txt)的相關資料,需要的朋友可以參考下
    2021-05-05

最新評論