1. ホーム
  2. c#

[解決済み】なぜC#のインターフェースはフィールドを含むことができないのですか?

2022-04-03 04:09:44

質問

例えば ICar インターフェイスを実装し、すべての実装にフィールド Year . これは、すべての実装が個別に Year ? 単純にインターフェイスで定義した方が良いのでは?

どのように解決するのですか?

他の多くの回答は意味レベルでは正しいのですが、私はこの種の質問に実装の詳細レベルからアプローチすることも面白いと思っています。

インターフェースは スロット を含む。 メソッド . クラスがインターフェースを実装するとき、クラスはランタイムに必要なすべてのスロットをどのように埋めるかを伝える必要があります。というとき

interface IFoo { void M(); } 
class Foo : IFoo { public void M() { ... } }

このクラスでは、「私のインスタンスを作成したら、IFoo.MのスロットにFoo.Mへの参照を挿入してください。

そして、呼び出しを行うと

IFoo ifoo = new Foo();
ifoo.M();

というコードを生成します。

インターフェイスがメソッドを含むスロットの集合体であるなら、それらのスロットのいくつかは、プロパティのgetとsetメソッド、インデクサのgetとsetメソッド、イベントのaddとremoveメソッドも含むことができます。 しかし フィールドはメソッドではありません。 . フィールドに関連付けられたquot;スロット"はなく、フィールドの位置への参照でquot;フィルイン"することができるのです。したがって、インターフェースはメソッド、プロパティ、インデクサ、イベントを定義することができますが、フィールドを定義することはできません。