如何定义接口成员的固定部分

时间:2014-11-03 15:43:01

标签: .net vb.net interface

这是我的界面:

Public Interface IProductComputer 
   Sub CalculatePrice
   Sub CalculateTax
   Sub Calculate
End Interface

以下是我的课程:

Public Class Product1 
       Implements IProductComputer
     ........
End Class

Public Class Product2
       Implements IProductComputer
    ......
End Class

问题:

我的界面可以在无限数量的类中使用,当然它应该分别在所有类中实现。但是如果方法中有一些共同的部分呢?例如,在CalculateTax方法中可能有一个共同的公式,并且在所有实现中包含此公式似乎并不令人愉快(而是在接口中实现此公式并在实现接口的类中实现不常见的部分)。

我已经看到了一些.Net预定义接口,它们有一些固定的部分,比如IDisposable(它实现时有一些主要的实现)。有没有办法创建像他们这样的界面?

(上面的代码是用Vb.Net编写的,但我也知道C#语法) 如果我不够清楚,请让我解释一下。

2 个答案:

答案 0 :(得分:2)

根据定义,接口不能实现任何方法/属性,只能定义它们。您有两种方法可以解决此问题:

  1. 将您的实现从接口更改为抽象类(我相信这是VB.net中的MustInherit)。抽象类可以实现一些成员,而其他成员只是定义。

  2. 将其保留为接口,如果您有已实现的方法,则可以将它们实现为接口的扩展方法。

  3. 这些解决方案都不适合您,但希望能够满足您的需求。

答案 1 :(得分:1)

你的问题的简单答案是否:接口不能包含代码,只有一个可接受的IDisposable模式,它被多次实现。

然而,围绕这个

有几种方法
  • 您可以实现和abstract类而不是接口。你失去了一些实现能力,因为它现在是一个类,因此实现不能从不同的类继承。但是,这被认为是接口和抽象类之间的主要区别 - 代码
  • 可以编写extension methods目标接口,允许您使用公共代码进行某些常见操作。然而,这变得非常有限,因为扩展方法只能访问接口成员,并且是静态的,因此不能以任何方式被覆盖。虽然您可以在派生类中重写具有相同名称的方法,但任何以扩展方法为目标的编译都将继续以该扩展方法为目标。