インターフェースと抽象クラス(一般的なオブジェクト指向) 質問する

インターフェースと抽象クラス(一般的なオブジェクト指向) 質問する

最近、電話インタビューを 2 回受けましたが、インターフェースと抽象クラスの違いについて質問されました。考えられるすべての側面を説明しましたが、何か具体的なことを言うのを待っているようで、それが何なのかわかりません。

私の経験からすると、次のことは真実だと思います。重要な点が抜けている場合は、お知らせください。

インターフェース:

インターフェイスで宣言されたすべてのメソッドは、サブクラスで実装する必要があります。インターフェイスには、イベント、デリゲート、プロパティ (C#)、およびメソッドのみが存在できます。クラスは複数のインターフェイスを実装できます。

抽象クラス:

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

  1. その後、面接官は「抽象メソッドのみを持つ抽象クラスがあったらどうなりますか?それはインターフェースとどう違うのでしょうか?」という質問をしました。答えはわかりませんでしたが、それは上で述べたように継承だと思います。

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

参照:

ベストアンサー1

たとえ話をしましょう。空軍にいた頃、私はパイロット訓練を受けて USAF (米国空軍) のパイロットになりました。その時点では何も操縦する資格がなく、航空機タイプの訓練を受ける必要がありました。資格を取得すると、私はパイロット (抽象クラス) と C-141 パイロット (具体クラス) になりました。ある任務で、安全責任者という追加の任務を与えられました。私はまだパイロットであり C-141 パイロットでしたが、安全責任者の職務も行いました (いわば ISafetyOfficer を実装しました)。パイロットは安全責任者になる必要はなく、他の人でもできました。

米空軍パイロットは全員、空軍全体の特定の規則に従わなければなりません。また、C-141 (または F-16、T-38) のパイロットは全員「米空軍パイロット」です。誰でも安全管理者になることができます。まとめると、次のようになります。

  • パイロット: 抽象クラス
  • C-141 パイロット: コンクリートクラス
  • ISafety Officer: インターフェース

注記を追加: これは概念を説明するのに役立つアナロジーであり、コーディングの推奨事項ではありません。以下のさまざまなコメントを参照してください。議論は興味深いです。

おすすめ記事