[解決済み] インターフェースと抽象クラス(一般的なOO)
質問
最近、電話インタビューが2回あり、InterfaceとAbstractクラスの違いについて質問されました。私は思いつく限りの説明をしたのですが、相手は何か具体的なことを言うのを待っているようで、それが何なのかがわかりません。
私の経験上、以下のように考えています。もし、大きなポイントが抜けていたら教えてください。
インターフェース
インターフェイスで宣言されたメソッドは、すべてサブクラスで実装する必要があります。 Interfaceに存在できるのは、Event、Delegate、Properties(C#)、Methodsだけです。1つのクラスは複数のInterfaceを実装することができます。
抽象的なクラスです。
抽象メソッドのみ、サブクラスで実装する必要があります。Abstractクラスは、実装された通常のメソッドを持つことができます。抽象クラスは、イベント、デリゲート、プロパティ、メソッドの他に、クラス変数を持つことができます。C#では多重継承ができないため、1つのクラスが実装できる抽象クラスは1つだけです。
-
そのあと、面接官から「抽象的なメソッドだけを持つ抽象クラスがあったらどうしますか?インターフェイスとどう違うのでしょうか?
-
また、別の面接官から「インターフェイスの中にPublic変数があった場合、抽象クラスとどう違うのですか?私は、インターフェイスの中にパブリック変数を持つことはできないと主張しました。私は彼が何を聞きたかったのか分かりませんでしたが、彼も納得がいかなかったようです。
参照 :
解決方法は?
ご質問の内容は、一般的なOO"に関するものですが、実際には、これらの用語の.NETでの使用に焦点を当てているようです。
.NETの場合(Javaの場合も同様)。
- インターフェースは、状態や実装を持つことができない
- インターフェースを実装するクラスは、そのインターフェースの全てのメソッドの実装を提供しなければなりません。
- 抽象クラスは、状態(データメンバ)および/または実装(メソッド)を含むことができます。
- 抽象クラスは、抽象メソッドを実装せずに継承することができる(ただし、そのような派生クラスはそれ自体が抽象である)。
- インターフェースは多重継承が可能ですが、抽象クラスはそうではありません(これはおそらく、インターフェースが抽象クラスとは別に存在する重要な具体的理由です - インターフェースは多重継承の実装を可能にし、一般のMIの問題の多くを取り除きます)。
一般的なOO用語として、その違いは必ずしも明確に定義されていない。例えば、C++プログラマの中には、同じような厳格な定義(インターフェイスは実装を含むことができない抽象クラスの厳格なサブセット)を持つ人もいれば、いくつかのデフォルト実装を持つ抽象クラスは依然としてインターフェイスであるとか、抽象クラス以外でもインターフェイスを定義できるなどと言う人もいます。
実際、NVI(Non-Virtual Interface)というC++のイディオムがあり、パブリックメソッドはプライベートなバーチャルメソッドに「サンク」するノンヴァーチャルメソッドになっています。
関連
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み] メソッドと関数の違いは何ですか?
-
[解決済み] インターフェースと抽象クラスの違いは何ですか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] mixinとは何か、なぜ有用なのか?
-
[解決済み] いつ使うか。Java 8+のインターフェイスのデフォルトメソッドと、抽象的なメソッドの比較
-
[解決済み] Pythonにおける抽象クラスとインターフェースの違い
-
[解決済み] Javaインターフェースでスタティックメソッドを定義できないのはなぜですか?
-
[解決済み] 抽象クラスの代わりにインターフェイスを使用する場合とその逆は?
-
[解決済み】「インターフェースに合わせたプログラム」とはどういう意味ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 関数型プログラミングとオブジェクト指向プログラミングの比較【終了しました
-
[解決済み] Java のコア・ライブラリにおける GoF デザイン・パターンの例
-
[解決済み] コヒーシ ョンとカップリングの違い
-
[解決済み】依存関係逆転の原則とは何ですか、なぜそれが重要なのですか?
-
[解決済み] ProxyパターンとDecoratorパターンの違い
-
[解決済み] メソッドチェイニング - なぜ良い習慣なのか、そうでないのか?
-
[解決済み] Delegateとは?[クローズド]。
-
[解決済み] 継承と集計の比較【終了しました
-
[解決済み] オブジェクト指向分析・設計によるエレベータのモデル化 [終了しました]
-
[解決済み] コンストラクタをprivateにするとどうなるのですか?