1. ホーム
  2. oop

[解決済み] インターフェースと抽象クラス(一般的なOO)

2022-03-17 14:36:31

質問

最近、電話インタビューが2回あり、InterfaceとAbstractクラスの違いについて質問されました。私は思いつく限りの説明をしたのですが、相手は何か具体的なことを言うのを待っているようで、それが何なのかがわかりません。

私の経験上、以下のように考えています。もし、大きなポイントが抜けていたら教えてください。

インターフェース

インターフェイスで宣言されたメソッドは、すべてサブクラスで実装する必要があります。 Interfaceに存在できるのは、Event、Delegate、Properties(C#)、Methodsだけです。1つのクラスは複数のInterfaceを実装することができます。

抽象的なクラスです。

抽象メソッドのみ、サブクラスで実装する必要があります。Abstractクラスは、実装された通常のメソッドを持つことができます。抽象クラスは、イベント、デリゲート、プロパティ、メソッドの他に、クラス変数を持つことができます。C#では多重継承ができないため、1つのクラスが実装できる抽象クラスは1つだけです。

  1. そのあと、面接官から「抽象的なメソッドだけを持つ抽象クラスがあったらどうしますか?インターフェイスとどう違うのでしょうか?

  2. また、別の面接官から「インターフェイスの中にPublic変数があった場合、抽象クラスとどう違うのですか?私は、インターフェイスの中にパブリック変数を持つことはできないと主張しました。私は彼が何を聞きたかったのか分かりませんでしたが、彼も納得がいかなかったようです。

参照 :

解決方法は?

ご質問の内容は、一般的なOO"に関するものですが、実際には、これらの用語の.NETでの使用に焦点を当てているようです。

.NETの場合(Javaの場合も同様)。

  • インターフェースは、状態や実装を持つことができない
  • インターフェースを実装するクラスは、そのインターフェースの全てのメソッドの実装を提供しなければなりません。
  • 抽象クラスは、状態(データメンバ)および/または実装(メソッド)を含むことができます。
  • 抽象クラスは、抽象メソッドを実装せずに継承することができる(ただし、そのような派生クラスはそれ自体が抽象である)。
  • インターフェースは多重継承が可能ですが、抽象クラスはそうではありません(これはおそらく、インターフェースが抽象クラスとは別に存在する重要な具体的理由です - インターフェースは多重継承の実装を可能にし、一般のMIの問題の多くを取り除きます)。

一般的なOO用語として、その違いは必ずしも明確に定義されていない。例えば、C++プログラマの中には、同じような厳格な定義(インターフェイスは実装を含むことができない抽象クラスの厳格なサブセット)を持つ人もいれば、いくつかのデフォルト実装を持つ抽象クラスは依然としてインターフェイスであるとか、抽象クラス以外でもインターフェイスを定義できるなどと言う人もいます。

実際、NVI(Non-Virtual Interface)というC++のイディオムがあり、パブリックメソッドはプライベートなバーチャルメソッドに「サンク」するノンヴァーチャルメソッドになっています。