おそらく「抽象クラスとインターフェイスの違い」は、.Net の世界で最もよく聞かれる質問です。理論的に違いを説明し、続いてコード スニペットを説明します。
私によると、理論的には、抽象クラスとインターフェイスには基本的に 5 つの違いがあり、以下にリストされています。
クラスは任意の数のインターフェイスを実装できますが、サブクラスは多くても 1 つの抽象クラスしか使用できません。
抽象クラスには非抽象メソッド (具象メソッド) を含めることができますが、インターフェイスの場合はすべてのメソッドを抽象にする必要があります。
抽象クラスは任意の変数を宣言または使用できますが、インターフェースはそうすることが許可されていません。したがって、次のコードはコンパイルされません:-
インターフェイス TestInterface
{
int x = 4; // Filed Declaration in Interface
void getMethod();
string getName();
}
抽象クラス TestAbstractClass
{
int i = 4;
int k = 3;
public abstract void getClassName();
}
次のようなコンパイル時エラーが生成されます:-
エラー 1 インターフェイスにフィールドを含めることはできません。
したがって、コードを適切にコンパイルするには、フィールド宣言を省略する必要があります。
インターフェイス TestInterface
{
void getMethod();
string getName();
}
抽象クラス TestAbstractClass
{
int i = 4;
int k = 3;
public abstract void getClassName();
}
インターフェイスにフィールド宣言がないため、上記のコードは適切にコンパイルされます。
4.抽象クラスはコンストラクタ宣言を持つことができますが、インターフェースはそうすることができません。
したがって、次のコードはコンパイルされません:-
インターフェイス TestInterface {
// Constructor Declaration
public TestInterface()
{
void getMethod();
string getName();
}
}
抽象クラス TestAbstractClass
{
public TestAbstractClass()
{
int i = 4;
int k = 3;
public abstract void getClassName();
}
}
上記のコードは、次のようにコンパイル時エラーを生成します:-
エラー 1 インターフェイスにコンストラクターを含めることはできません
したがって、コードをコンパイルするには、インターフェースからコンストラクタ宣言を省略する必要があります。
次のコードは完全にコンパイルされます:-
インターフェイス TestInterface {
void getMethod();
string getName();
}
抽象クラス TestAbstractClass {
public TestAbstractClass()
{
int i = 4;
int k = 3;
public abstract void getClassName();
}
}
5.抽象クラスは、そのすべてのメンバー宣言に対してすべてのアクセス修飾子を持つことができますが、インターフェイスでは、インターフェイスのすべてのメンバーが暗黙的にパブリックであるため、アクセス修飾子 (パブリックを含む) を宣言することはできません。
注: ここでは、インターフェイスについてではなく、インターフェイスのメンバーのアクセス指定子について話しています。
次のコードはそれをよりよく説明します:-
提供アクセス指定子を Public として指定することは完全に合法です (public のみが許可されていることに注意してください)。
パブリック インターフェイス TestInterface
{
void getMethod();
string getName();
}
上記のコードは完全にコンパイルされます。
インターフェイスのメンバーにアクセス指定子を与えることは許可されていません。
インターフェイス TestInterface
{
public void getMethod();
public string getName();
}
上記のコードは、次のようにコンパイル時エラーを生成します:-
エラー 1 修飾子 'public' はこのアイテムには無効です。
ただし、インターフェイスを宣言する最善の方法は、インターフェイスのアクセス指定子とインターフェイスのメンバーを避けることです。
インターフェイス テスト
{
void getMethod();
string getName();
}