在 C# 中的介面中實現屬性

Bilal Shahid 2023年10月12日
  1. 使用簡單程式碼塊在介面中設定屬性
  2. 在 C# 中對介面中的屬性進行修改
  3. 在抽象類中實現具有多個介面繼承的屬性
  4. まとめ
在 C# 中的介面中實現屬性

今天,我們將學習如何在 C# 中的介面中實現屬性。

C# 中的介面可以有許多不同的屬性,以及指定我們應該如何在其中宣告屬性可用性的訪問修飾符。該介面通常充當不同成員和物件的預設實現。

讓我們開始看看我們可以在介面中實現屬性的各種方式。

使用簡單程式碼塊在介面中設定屬性

假設我們在 C# 中建立了一個名為 ENGINE 的介面,並帶有 TORQUE 屬性。我們將設定介面 ENGINE 如下:

public interface ENGINE {
  int torque { get; set; }
}

因此,我們為它的屬性建立了一個具有適當的 getter 和 setter 的介面,稱為 TORQUE。要使用該介面,我們必須繼續定義一個可以實現該介面的類。

假設我們要定義一個包含 ENGINECAR 類。因此我們可以這樣寫:

class CAR : ENGINE {
  public int torque { get; set; }
}

請注意,在從此類建立物件時,CAR 類包含公共使用的 TORQUE 實現。要使用 CAR 物件,只需如下呼叫:

CAR x = new CAR();
x.torque = 989;
Console.WriteLine(x.torque);

因此,你可以使用不同的屬性並將它們包含在介面中以供以後使用。這提供了更好的抽象層,並允許在不更改主要方法或類的情況下進行修改。

因此,如果我們想為 ENGINE 新增一個名為 LABEL 的新屬性,我們可以在介面 ENGINE 中設定它,該介面可以在類 CAR 中使用。

整個程式碼如下所示:

using System;

namespace CA_ONE {
  class Program {
    public interface ENGINE {
      int torque { get; set; }
    }

    class CAR : ENGINE {
      public int torque { get; set; }
    }

    static void Main(string[] args) {
      CAR x = new CAR();
      x.torque = 989;
      Console.WriteLine(x.torque);
    }
  }
}

我們已將我們的專案命名為 CA_ONE;因此名稱空間擴充套件並實現它。這裡要注意的另一件事是,CARTORQUE 的實現可以在其函式內部有其他定義,例如 PRINT 方法或扭矩轉換等。

在 C# 中對介面中的屬性進行修改

在上面提供的解決方案中,我們提到了如何在我們的實現中定義其他方法。假設我們想擴充套件介面 ENGINE 中預設定義的 GETSET 方法。

我們將保持 ENGINE 不變,但傾向於修改擴充套件它的 CAR 類中的程式碼。

CAR 中,當我們設定 TORQUE 時,我們可能還想列印 "Torque is Set to _value_" 以便我們的使用者知道 TORQUE 屬性是否已正確設定。

因此,我們可以繼續執行以下操作:

class CAR : ENGINE {
  private int torque_priv;
  public int torque {
    get { return this.torque_priv; }
    set {
      this.torque_priv = value;
      Console.WriteLine("This torque has been set to " + torque_priv);
    }
  }
}

現在在這裡,讓我們關注程式碼中發生的事情。我們注意到的第一件事是使用另一個名為 TORQUE_PRIV 的變數。

我們已經例項化了它,因為我們需要儲存在以下程式碼中傳遞的 TORQUE 值:

x.torque = 989;

如果不是這樣,你不使用 TORQUE_PRIV 變數,程式碼將陷入迴圈,遞迴移動以將值分配給 TORQUE 屬性。另外,我們在這裡使用了一種叫做 VALUE 的東西。

請注意,VALUE 不是變數,而是 C# 中的上下文關鍵字。VALUE 用於屬性和訪問宣告的集合索引器中。

它獲取客戶端分配的值並將其分配給類的私有變數。通過這種方式,你可以修改和使用你的宣告。

很多人會在 TORQUE 的 setter 中使用以下程式碼來表示抽象 CAR

this.torque_priv = torque;

對於 GETTER:

return torque;

由於陷入遞迴迴圈,這將出現如下錯誤:

Stack overflow.

在介面中實現任何屬性的一般語法如下:

type name { get; set; }

因為多個類可以繼承和使用介面,所以在抽象類中擴充套件和修改屬性會更好。在實現不同的方法時,介面可以作為骨幹結構,並提供關於什麼和什麼不擴充套件的基本概念。

請記住,介面不能直接使用。他們需要在執行程式碼時初始化和使用抽象類。

介面中的方法始終是公共的,不需要任何隱式訪問修飾符。此外,介面可以從其他介面繼承。

如果你試圖在一個介面中實現一個屬性,而另一個介面繼承了之前定義的那個,你可以使用一個類來擴充套件後一個介面。

假設我們有一個介面 ENGINE,它繼承 BOLTS,然後被類 CAR 繼承。我們想根據每個 CAR 的螺栓尺寸安裝一個扳手尺寸的應急套件。

因此,我們可以使用如下實現:

public interface BOLT {
  int size { get; set; }
}

public interface ENGINE : BOLT {
  int torque { get; set; }

然後在類 CAR 中擴充套件 BOLT 如下:

public int size {
  get { return wrench_size; }
  set {
    // set the wrench size
    wrench_size = value;
    Console.WriteLine("The wrench size to use should be: " + wrench_size);
  }
}

所以你可以看到任何介面都是繼承的。如果在基介面中設定屬性,則需要在擴充套件基介面或派生介面的所有類中實現該屬性。

因此有必要擴充套件定義。

在抽象類中實現具有多個介面繼承的屬性

假設我們有兩個介面:ENGINEWHEEL。它們都包含一個啟動方法,告訴我們 ENGINEWHEEL 是否已啟動。

讓我們定義一個啟動方法。

public interface WHEEL {
  void print();
}

public interface ENGINE : BOLT {
  int torque { get; set; }
  void print();
}

要在 CAR 類中擴充套件它,你需要編寫一些函式,如下所示:

void WHEEL.print() {
  Console.WriteLine("Wheel has been started");
}
void ENGINE.print() {
  Console.WriteLine("Engine has been started!");
}

要呼叫它們,請在 main 中編寫如下內容:

((WHEEL)x).print();

這是為了指定要使用 print() 方法的介面。

訪問本教程中使用的完整程式碼於此處

まとめ

這就是如何在介面中使用屬性的全部內容。可能有不同的情況下我們需要設定和使用一個屬性; 因此,最好研究上述所有情況。

作者: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub