Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Api 是否有理由使用抽象类而不是接口来参数化?_Api_Oop_Interface_Anti Patterns - Fatal编程技术网

Api 是否有理由使用抽象类而不是接口来参数化?

Api 是否有理由使用抽象类而不是接口来参数化?,api,oop,interface,anti-patterns,Api,Oop,Interface,Anti Patterns,我目前正在开发一个基于组件的API,它非常有状态。顶级组件实现了大约12个接口 因此,库存顶级组件位于抽象实现堆栈的顶部,抽象实现堆栈依次包含多个mixin实现和多个mixin接口 到目前为止,一切都很好(我希望如此) 问题是基本功能的实现非常复杂(5层基类中有1000行),因此我不希望组件编写器自己实现接口,而是扩展我的基类(所有锅炉板代码都已编写) 如果API因此接受接口,而不是我希望组件编写者扩展的抽象实现的引用,那么我就有一个风险,即实现者将不会执行其他代码领域所要求和假设的验证 因此,

我目前正在开发一个基于组件的API,它非常有状态。顶级组件实现了大约12个接口

因此,库存顶级组件位于抽象实现堆栈的顶部,抽象实现堆栈依次包含多个mixin实现和多个mixin接口

到目前为止,一切都很好(我希望如此)

问题是基本功能的实现非常复杂(5层基类中有1000行),因此我不希望组件编写器自己实现接口,而是扩展我的基类(所有锅炉板代码都已编写)

如果API因此接受接口,而不是我希望组件编写者扩展的抽象实现的引用,那么我就有一个风险,即实现者将不会执行其他代码领域所要求和假设的验证

因此,我的问题是,有时使用抽象实现引用而不是对其实现的接口的引用来参数化API方法是否有效

您是否有一个设计良好的API使用这种技术的例子,或者我是在试图说服自己进行不好的实践

到目前为止,一切都很好(我希望如此)

不完全是。实现十几个接口不是一个好迹象。但我不知道如何重构,或者说是可能的,因为我不知道代码

因此,我的问题是,有时使用抽象实现引用而不是对其实现的接口的引用来参数化API方法是否有效

很少,是的。例如(Java):

  • JSF:
    javax.faces.context.FacesContext
    是抽象的,但作为参数传递
  • EL:
    javax.EL.ELContext
    -同上
  • AWT:
    java.AWT.Image
    -同上
但无论如何,我会说不。把开发人员限制在实现上是不好的。他们可能希望提供一个不应执行上述任何验证的模拟,或者使用动态代理


最后,如果您完全确定无法重新构造接口,则可以使用尽可能少的抽象类参数。

以防万一-有问题的语言是什么?在这个特定的用例中,动态代理将如何帮助您?我看不出如何帮助。但我错过了整个画面。