C# のインターフェイスにプロパティを実装する
今日は、C# のインターフェイスにプロパティを実装する方法を学習します。
C# のインターフェイスには、プロパティの可用性を宣言する方法を指定するアクセス修飾子とともに、さまざまなプロパティを含めることができます。インターフェイスは、多くの場合、さまざまなメンバーやオブジェクトのデフォルトの実装として機能します。
始めて、インターフェースにプロパティを実装するためのさまざまな方法を見てみましょう。
単純なコードブロックを使用して、インターフェイスにプロパティを設定する
TORQUE
プロパティを使用して、ENGINE
と呼ばれる C# のインターフェイスを作成するとします。インターフェイス ENGINE
を次のように設定します。
public interface ENGINE {
int torque { get; set; }
}
したがって、TORQUE
と呼ばれるそのプロパティの適切なゲッターとセッターを備えたインターフェースを作成しました。インターフェイスを使用するには、先に進んで、このインターフェイスを実装できるクラスを定義する必要があります。
ENGINE
を含む CAR
クラスを定義するとします。したがって、次のように書くことができます。
class CAR : ENGINE {
public int torque { get; set; }
}
CAR
クラスには、このクラスからオブジェクトを作成するときに公開するための TORQUE
の実装が含まれていることに注意してください。CAR
オブジェクトを使用するには、次のように呼び出すだけです。
CAR x = new CAR();
x.torque = 989;
Console.WriteLine(x.torque);
したがって、さまざまなプロパティを使用して、後で使用するためにそれらをインターフェイスに含めることができます。これにより、抽象化レイヤーが改善され、メインのメソッドやクラスを変更せずに変更できるようになります。
したがって、LABEL
という新しいプロパティを ENGINE
に追加する場合は、クラス CAR
で使用できるインターフェイス ENGINE
に設定できます。
コード全体は次のようになります。
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
という名前を付けました。したがって、名前空間はそれを拡張して実装します。ここでもう 1つ注意すべき点は、CAR
での TORQUE
の実装では、PRINT
メソッドやトルク変換など、関数内に他の定義を含めることができるということです。
C# のインターフェイスのプロパティの変更
上記のソリューションでは、実装内で他のメソッドを定義する方法について説明しました。インターフェイス ENGINE
でデフォルトとして定義されている GET
メソッドと SET
メソッドを拡張したいとします。
ENGINE
はそのままにしておきますが、それを拡張するクラス CAR
内のコードを変更する傾向があります。
CAR
では、TORQUE
を設定するときに、TORQUE
プロパティが正しく設定されているかどうかをユーザーが知るために、"Torque is Set to _value_"
を出力することもできます。
したがって、先に進んで次のようにすることができます。
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
は、プロパティおよびアクセス宣言のセットインデクサーで使用されます。
クライアントによって割り当てられた値を受け取り、それをクラスのプライベート変数に割り当てます。このようにして、宣言を変更して使用できます。
多くの人は、抽象的な CAR
の TORQUE
のセッターで次のコードを使用します。
this.torque_priv = torque;
そしてゲッターのために:
return torque;
これにより、再帰ループでスタックするため、次のエラーが発生します。
Stack overflow.
インターフェイスにプロパティを実装するための一般的な構文は次のとおりです。
type name { get; set; }
複数のクラスがインターフェイスを継承して使用できるため、抽象クラスのプロパティを拡張および変更する方が適しています。インターフェイスは、さまざまなメソッドを実装する際のバックボーン構造として機能し、拡張するものと拡張しないものの基本的な考え方を提供します。
インターフェイスを直接使用することはできないことに注意してください。コードの実行中に抽象クラスを初期化して使用する必要があります。
インターフェイスのメソッドは常にパブリックであり、暗黙的なアクセス修飾子は必要ありません。また、インターフェイスは他のインターフェイスから継承できます。
インターフェイスにプロパティを実装しようとしていて、別のインターフェイスが以前に定義されたものを継承している場合は、クラスを使用して後者のインターフェイスを拡張できます。
BOLTS
を継承し、次にクラス CAR
によって継承されるインターフェース ENGINE
があると仮定します。各 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);
}
}
したがって、どのインターフェイスも継承されていることがわかります。ベースインターフェイスでプロパティを設定する場合は、ベースインターフェイスまたは派生インターフェイスのいずれかを拡張するすべてのクラスにそのプロパティを実装する必要があります。
したがって、定義を拡張する必要があります。
抽象クラスで複数のインターフェイス継承を使用してプロパティを実装する
ENGINE
と WHEEL
の 2つのインターフェースがあるとしましょう。また、どちらにも start メソッドが含まれており、ENGINE
または WHEEL
が開始したかどうかを示します。
start メソッドを定義しましょう。
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!");
}
そしてそれらを呼び出すために、メインで次のように何かを書いてください:
((WHEEL)x).print();
これは、print()
メソッドを使用するインターフェイスを指定するためのものです。
このチュートリアルで使用されている完全なコードにアクセスしますここ。
まとめ
インターフェイスでプロパティを使用する方法は以上です。プロパティを設定して使用する必要がある状況はさまざまです。したがって、上記のすべてのケースを調査することをお勧めします。
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