C#の基本的なインターフェイス学習
1.定義
インターフェースは、さまざまなアプリケーションを実現するための一種の規範と制約を提供します。各アプリケーションがこの種の規範と制約に準拠している限り、システム全体を効果的に編成できるため、アプリケーションシステム。
インターフェイスは、interfaceキーワードを使用して定義され、メソッド、属性、イベント、インデクサー、またはこれら4つのメンバータイプの任意の組み合わせで構成できます。メソッドや属性は実装されていませんが、少なくともどの関数を実装する必要があるかを継承クラスに通知するだけであり、継承クラスは独自のメソッドを追加できます。
インターフェイスステートメント:
interface ISample
{
void Sample(int x); //方法
int count { get; set; } //属性(可读,可写)
event EventHandler OnDraw; //事件
string this[int index] { get; set; } //索引器
}
2.機能
-
インターフェイスは抽象クラスに似ており、インターフェイスを直接インスタンス化することはできません
-
インターフェイスのメソッドは抽象メソッド(抽象メソッドとして定義されていない)であり、インターフェイスを実装する非抽象クラスは、インターフェイスのすべてのメンバーを実装する必要があります
-
インターフェイスのメンバーが明示的に実装されている場合、メンバーにはインターフェイスインスタンスを介してのみアクセスできます
インターフェイスのメンバーが暗黙的に実装されている場合、メンバーはクラスインスタンスを介してアクセスでき、メンバーはインターフェイスインスタンスを介してアクセスすることもできます。
いずれにせよ、その前提はメンバーが公開されていなければならないということです
-
インターフェイスは、定数、フィールド、演算子、強度コンストラクター、静的メンバー、デストラクタ、または型などを保証できません。
-
インターフェイスメンバーは自動的に公開され、アクセス修飾子を含めることはできません
-
インターフェイスは複数のインターフェイスから継承でき、クラスまたは構造体は複数のインターフェイスを継承できますが、インターフェイスはクラスを継承できません
-
クラスが基本クラスとインターフェイスの両方を継承する場合、基本クラスを前に記述し、基本クラスとインターフェイスをコンマで区切る必要があります。クラスは1つの基本クラスのみを持つことができますが、複数のインターフェイスを継承できます
インターフェイスの明示的な実装とインターフェイスの暗黙的な実装に関する説明:
(1)インターフェースを暗黙的に実装する
Speakメンバーを含むIChineseインターフェースを作成します
namespace InterfaceLearn
{
public interface IChinese
{
string Speak();
}
}
このインターフェイスを継承し、インターフェイスメンバーを実装するSpeakerクラスを作成します
namespace InterfaceLearn
{
public class Speaker:IChinese
{
public string Speak()
{
return "中文";
}
}
}
呼び出しメソッドを暗黙的に実装します。
(インターフェイスインスタンスを介してメンバーにアクセスします)
または
(クラスインスタンスを介してメンバーにアクセスします)
(2)ディスプレイ実装インターフェース
Speakメンバーを含むIEnglishインターフェースを作成する
namespace InterfaceLearn
{
public interface IEnglish
{
string Speak();
}
}
インターフェイスを継承し、インターフェイスメンバーを実装するための英語クラスを作成します
namespace InterfaceLearn
{
public class English:IEnglish
{
string IEnglish.Speak()
{
return "英语";
}
}
}
呼び出し元のメソッドを明示的に実装します。
(メンバーには、インターフェイスインスタンスを介してのみアクセスできます)
クラスインスタンスを使用してメンバーにアクセスすると、次の状況が発生します。
3.インターフェイスと抽象クラスの違い
-
インターフェースは仕様に使用され、抽象クラスは共通性に使用されます
-
抽象クラスはインスタンス化できませんが、独自のメンバーフィールドと非抽象メソッドを持つことができますが、インターフェイスは抽象クラスよりも抽象的であり、メンバーは一般的なメソッド、属性、インデックス関数のみであり、独自のメンバーフィールドを持つことはできません。およびコンストラクタ。、
-
抽象クラスはクラスであるため、単一でのみ継承できますが、インターフェイスは一度に複数の継承を実装できます
-
抽象クラスは特定のメソッドの部分的な実装を提供できますが、インターフェイスは提供できません
-
インターフェイス、抽象クラス、および非抽象クラスはすべてインターフェイスを継承できます
-
abstractで宣言されたabstractクラスのメソッドは、publicなどのアクセス修飾子などのキーワードで変更する必要があります。次に、abstractクラスのメソッドは、abstractまたはvirtualを仮想メソッドとして持つabstractメソッドとして宣言する必要があります(非abstractメソッドを除く)。 、仮想メソッド)単純な実行コードがあり、派生クラスは書き換えないことを選択でき、抽象メソッドには実行コードがなく、派生クラスを書き換える必要があります)。派生クラスの抽象メソッドまたは仮想メソッドを書き換える場合は、オーバーライドして変更する必要があります。interfaceで宣言されたインターフェイスのインターフェイスメソッドは、最初に静的にすることはできません。次に、実行コードがないことを除いて、アクセス制限修飾子を追加することはできません。また、仮想または抽象で変更することもできません。同時に、override修飾子を使用して継承されたインターフェイスクラスのメソッドをオーバーライドすることはできません。継承されたインターフェイスのすべてのメソッドを実装する必要がありますが、newキーワードを使用して親インターフェイスのメソッドを非表示にすることができます。
完全な例:
1. 2つのインターフェースを作成します:IPerson、IStudent
namespace InterfaceLearn
{
public interface IPerson
{
string Name { get; set; }
void Show(string name);
}
}
namespace InterfaceLearn
{
public interface IStudent
{
string StudentId { get; set; }
void Show(string studentId);
}
}
2. 2つのインターフェイス(明示的な実装と暗黙的な実装を含む)を継承するStudentクラスを作成します
namespace InterfaceLearn
{
public class Student : IPerson, IStudent
{
//隐式实现接口
private string _name;
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
public void Show(string name)
{
Console.WriteLine("姓名为{0}", name);
}
//显式实现接口
private string _studentId;
string IStudent.StudentId
{
get
{
return _studentId;
}
set
{
_studentId = value;
}
}
void IStudent.Show(string studentId)
{
Console.WriteLine("学号为{0}", studentId);
}
}
}
3.コードを実行します
namespace InterfaceLearn
{
class Program
{
static void Main(string[] args)
{
Student s = new Student();
Console.WriteLine("输入姓名");
s.Name = Console.ReadLine();
Console.WriteLine("输入学号");
IStudent id = s;//由于是显式实现,所以必须通过接口实例
id.StudentId = Console.ReadLine();
s.Show(s.Name);
id.Show(id.StudentId);
Console.ReadLine();
}
}
}