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

时间:2010-01-13 19:04:26

标签: c# class inheritance interface components

我想知道一个类是否可以从类和接口继承。 下面的示例代码不起作用,但我认为它传达了我想要做的事情。 我想这样做的原因是因为我公司生产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;
   }
}

4 个答案:

答案 0 :(得分:231)

是。尝试:

class USBDevice : GenericDevice, IOurDevice

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

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

答案 1 :(得分:20)

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

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

答案 2 :(得分:19)

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

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


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

public interface ITwo : IOne

技术答案是ITwo确实继承了IOne,原因如下:

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

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

答案 3 :(得分:1)

我找到了问题第二部分的答案。 是的,只要接口被声明为public,类就可以实现一个不同类的接口。