web-dev-qa-db-ja.com

C#では、クラスは別のクラスとインターフェイスを継承できますか?

クラスがクラスとインターフェースから継承できるかどうかを知りたい。以下のサンプルコードは機能しませんが、私がやりたいことを伝えていると思います。私がこれをしたいのは、私の会社でUSB、シリアル、イーサネットなどのデバイスを作っているからです。すべてのアプリケーションで共通のもの(接続、切断、ファームウェアの取得など)を維持するのに役立つすべてのデバイスのプログラムを作成するために使用できる汎用コンポーネント/インターフェイスを開発しようとしています。

この質問に追加するには:GenericDeviceが別のプロジェクトにある場合、そのプロジェクトにIOurDevicesインターフェイスを配置してから、最初のプロジェクトへの参照を追加する場合、USBDeviceクラスにインターフェイスを実装させますか? 1つのプロジェクトを参照し、デバイスが何であるかに応じて異なるインターフェイスを実装するためです。

class GenericDevice
{
   private string _connectionState;
   public connectionState
   {
      get{return _connectionState; }
      set{ _connectionState = value;}
   }
}

interface IOurDevices
{
   void connectToDevice();
   void DisconnectDevice();
   void GetFirmwareVersion();
}

class USBDevice : IOurDevices : GenericDevice
{
   //here I would define the methods in the interface
   //like this...
   void connectToDevice()
   {
       connectionState = "connected";
   }
}

//so that in my main program I can do this...

class myProgram
{
   main()
   {
      USBDevice myUSB = new USBDevice();
      myUSB.ConnectToDevice;
   }
}
122
PICyourBrain

はい。試してください:

class USBDevice : GenericDevice, IOurDevice

注:基本クラスは、インターフェイス名のリストの前に来る必要があります。

もちろん、インターフェイスが定義するすべてのメンバーを実装する必要があります。ただし、基本クラスにインターフェイスメンバに一致するメンバが含まれている場合、基本クラスメンバはインターフェイスメンバの実装として機能するため、手動で再度実装する必要はありません。

233
Mehrdad Afshari

いいえ、正確ではありません。ただし、クラスおよびimplement 1つ以上のインターフェイスから継承できます。

このような概念を議論するときは、明確な用語が重要です。 Jon Skeetの著作をマークアウトすることの1つは、たとえばここと印刷物の両方で、物事を説明する方法が常に正確であることです。

20
David M

質問とは無関係です(Mehrdadの答えはあなたを助けてくれるはずです)、そしてこれが軽快なものとは思われないことを願っています:クラスはinheritインターフェース、 それらを実装する

.NETは多重継承をサポートしていないため、用語をそのままにしておくとコミュニケーションに役立ちます。クラスは1つのスーパークラスから継承でき、必要な数のインターフェイスを実装できます。


Ericのコメントに応えて...インターフェイスを「継承」、「実装」、「必須」、または「持ち込む」などの宣言を別の開発者と話し合いました。

public interface ITwo : IOne

技術的な答えは、ITwoはいくつかの理由でIOneを継承します。

  • インターフェイスneverには実装があるため、ITwoimplementsIOneは平坦ではありません
  • ITwoIOneメソッドを継承し、IOneMethodOne()が存在する場合は、ITwoからもアクセスできます。つまり:ITwoにはMethodOne()の定義が明示的に含まれていなくても、((ITwo)someObject).MethodOne())は有効です。
  • ...ランタイムがそう言うからです! typeof(IOne).IsAssignableFrom(typeof(ITwo))trueを返します

インターフェースが真/完全な継承をサポートすることに最終的に合意しました。欠落している継承機能(オーバーライド、抽象/仮想アクセサーなど)は、インターフェース継承からではなく、インターフェースから欠落しています。それでもコンセプトをシンプルまたは明確にするわけではありませんが、エリックの世界で実際に何が起こっているのかを理解するのに役立ちます:-)

19
STW

質問の2番目の部分の答えを見つけました。はい、クラスは、インターフェイスがパブリックとして宣言されている限り、別のクラスにあるインターフェイスを実装できます。

1
PICyourBrain