インタフェースの定義と実装
2455 ワード
前にインタフェースについて話しましたが、いくつかの概念のもので、実際の応用はありません.次にインタフェースの使用を学びましょう.
次に、インタフェースの継承仕様に従う小さな例を開発し、インタフェースの定義と使用方法を説明します.この例は銀行口座に基づいている.コードを記述すると仮定し、最終的に銀行口座間でコンピュータ振替業務を許可する.多くの会社は銀行口座を実現することができますが、銀行口座のすべてのクラスがインタフェースIBankAccountを実現することに賛成しています.このインタフェースには、入金に使用するメソッドと、残高を返すプロパティが含まれます.このインタフェースはまた、外部コードが異なる銀行口座によって実行される様々な銀行口座クラスを識別することを可能にする.私たちの目的は、口座間で振り替え業務を行うために銀行口座同士の通信を許可することですが、この機能はまだ紹介されていません.
まず、IBankインタフェースを定義する必要があります.
インタフェースの名前はIBankAccountです.インタフェース名は、従来、インタフェースであることを知るためにアルファベットIで始まる.
銀行口座を表すクラスを作成できるようになりました
このクラスの実装コードの役割は一目瞭然である.預金または引き出し時にこのフィールドを調整するプライベートフィールドbalanceが含まれています.口座の金額が不足して引き出しに失敗した場合、エラーメッセージが表示されます.
SaverAccountはインタフェースIbankAccountから派生し、他のベースクラスは明確に指摘されていません(もちろん、SaverAccountはSystem.Objectから直接派生していることを示しています).また,インタフェースからの派生はクラスからの派生とは完全に独立している.
SaverAccountはIBankAccountから派生し、IBankAccountのすべてのメンバーを取得したことを示すが、インタフェースは実際にその方法を実装していないため、SaverAccountはこれらの方法のすべての実装コードを提供しなければならない.インプリメンテーションコードが指定されていない場合、コンパイラにエラーが発生します.インタフェースはメンバーの存在のみを表し、クラスはこれらのメンバーが仮想的であるか抽象的であるかを決定します(ただし、クラス自体が抽象的である場合にのみ、これらのメンバーが抽象的であることができます).この例では、インタフェースメソッドは仮想的である必要はありません.
IBankAccount test = new SaverAccount();
test.PayIn(700); test.Withdraw(600);
Console.WriteLine(test.ToString());
このコードでは,参照変数をIBankAccount参照として宣言する方法が重要である.これは、このインタフェースを実装する任意のクラスのインスタンスを指すことができることを示す.しかし、これらのリファレンスからインタフェースを呼び出す方法しかありません.クラスによって実行されるインタフェースにないメソッドを呼び出すには、リファレンスを適切なタイプに強制的に変換する必要があります.
IBankAccount[] accounts = new IBankAccount[2]; accounts[0] = new SaverAccount(); accounts[1] = new GoldAccount();
次に、インタフェースの継承仕様に従う小さな例を開発し、インタフェースの定義と使用方法を説明します.この例は銀行口座に基づいている.コードを記述すると仮定し、最終的に銀行口座間でコンピュータ振替業務を許可する.多くの会社は銀行口座を実現することができますが、銀行口座のすべてのクラスがインタフェースIBankAccountを実現することに賛成しています.このインタフェースには、入金に使用するメソッドと、残高を返すプロパティが含まれます.このインタフェースはまた、外部コードが異なる銀行口座によって実行される様々な銀行口座クラスを識別することを可能にする.私たちの目的は、口座間で振り替え業務を行うために銀行口座同士の通信を許可することですが、この機能はまだ紹介されていません.
まず、IBankインタフェースを定義する必要があります.
public interface IBankAccount
{
void PayIn(decimal amount);
bool Withdraw(decimal amount);
decimal Balance
{
get;
}
}
インタフェースの名前はIBankAccountです.インタフェース名は、従来、インタフェースであることを知るためにアルファベットIで始まる.
銀行口座を表すクラスを作成できるようになりました
public class SaverAccount : IBankAccount
{
private decimal balance;
public void PayIn(decimal amount)
{
balance += amount;
}
public bool Withdraw(decimal amount)
{
if (balance >= amount)
{
balance -= amount;
return true;
}
Console.WriteLine("Withdrawal attempt failed.");
return false;
}
public decimal Balance
{
get
{
return balance;
}
}
public override string ToString()
{
return String.Format("Venus Bank Saver: Balance = {0,6:C}", balance);
}
}
このクラスの実装コードの役割は一目瞭然である.預金または引き出し時にこのフィールドを調整するプライベートフィールドbalanceが含まれています.口座の金額が不足して引き出しに失敗した場合、エラーメッセージが表示されます.
SaverAccountはインタフェースIbankAccountから派生し、他のベースクラスは明確に指摘されていません(もちろん、SaverAccountはSystem.Objectから直接派生していることを示しています).また,インタフェースからの派生はクラスからの派生とは完全に独立している.
SaverAccountはIBankAccountから派生し、IBankAccountのすべてのメンバーを取得したことを示すが、インタフェースは実際にその方法を実装していないため、SaverAccountはこれらの方法のすべての実装コードを提供しなければならない.インプリメンテーションコードが指定されていない場合、コンパイラにエラーが発生します.インタフェースはメンバーの存在のみを表し、クラスはこれらのメンバーが仮想的であるか抽象的であるかを決定します(ただし、クラス自体が抽象的である場合にのみ、これらのメンバーが抽象的であることができます).この例では、インタフェースメソッドは仮想的である必要はありません.
IBankAccount test = new SaverAccount();
test.PayIn(700); test.Withdraw(600);
Console.WriteLine(test.ToString());
このコードでは,参照変数をIBankAccount参照として宣言する方法が重要である.これは、このインタフェースを実装する任意のクラスのインスタンスを指すことができることを示す.しかし、これらのリファレンスからインタフェースを呼び出す方法しかありません.クラスによって実行されるインタフェースにないメソッドを呼び出すには、リファレンスを適切なタイプに強制的に変換する必要があります.
IBankAccount[] accounts = new IBankAccount[2]; accounts[0] = new SaverAccount(); accounts[1] = new GoldAccount();