在C#中,一个类可以继承自另一个类和接口吗?

PIC*_*ain 123 c# inheritance components interface class

我想知道一个类是否可以从类和接口继承.下面的示例代码不起作用,但我认为它传达了我想要做的事情.我想这样做的原因是因为我公司生产USB,串口,以太网等设备.我正在尝试开发一个通用组件/接口,我可以用它为我们所有的设备编写程序,这将有助于保持所有应用程序的常见事物(如连接,断开连接,获取固件)相同.

添加到这个问题:如果GenericDevice在不同的项目中,我可以将IOurDevices接口放在该项目中,然后如果我添加对第一个项目的引用,则使USBDevice类实现接口吗?因为想要引用一个项目,然后根据设备的不同实现不同的接口.

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;
   }
}
Run Code Online (Sandbox Code Playgroud)

Meh*_*ari 234

是.尝试:

class USBDevice : GenericDevice, IOurDevice
Run Code Online (Sandbox Code Playgroud)

注意:基类应位于接口名称列表之前.

当然,您仍然需要实现接口定义的所有成员.但是,如果基类包含与接口成员匹配的成员,则基类成员可以作为接口成员的实现,并且不需要再次手动实现它.

  • +1 还澄清了我想问的关于 Base 和 Interface 中相同成员的问题。 (2认同)

Dav*_*d M 20

不,不完全是.但它可以从类继承并实现一个或多个接口.

在讨论这样的概念时,明确的术语很重要.你会看到的其中一件事,标志着Jon Skeet的作品,例如,无论是在这里还是在印刷品中,都是因为他总是精确地描述事物的方式.

  • 或Eric Lippert,他的写作非常准确. (8认同)

STW*_*STW 19

与问题无关(Mehrdad的答案应该让你去),我希望这不会被视为挑剔:类不继承接口,它们实现它们.

.NET不支持多重继承,因此保持条款直接有助于沟通.一个类可以从一个超类继承,并且可以实现任意数量的接口.


回应Eric的评论......我和另一个开发人员讨论了接口是否"继承","实现","需要"或"带来"接口的声明如下:

public interface ITwo : IOne
Run Code Online (Sandbox Code Playgroud)

技术上的答案是ITwo继承IOne的原因有以下几点:

  • 接口永远不会有实现,因此认为ITwo 工具 IOne是错误的
  • ITwo继承IOne方法,如果MethodOne()存在,IOne那么它也可以从中访问ITwo.ie:((ITwo)someObject).MethodOne())有效,即使ITwo没有明确包含定义MethodOne()
  • ...因为运行时这么说! typeof(IOne).IsAssignableFrom(typeof(ITwo))回报true

我们最终同意接口支持true/full继承.接口缺少缺少的继承功能(例如覆盖,抽象/虚拟访问器等),而不是接口继承.它仍然没有使概念变得简单或清晰,但它有助于理解Eric的世界中真正发生的事情:-)

  • 但遗憾的是,接口*继承了*其他接口.我发现这些词语的选择很不幸,但我们现在却坚持不懈.我更喜欢将接口视为*需要*其他接口.也就是说,当你说"接口IFoo:IBar"时,意味着"IFoo的实现者也需要实现IBar". (2认同)