接口依赖于具体类是否可以?


9

我在Java中为自定义错误处理程序创建接口。

想要传递一个参数错误对象,但我需要它成为Exception类的子对象。

在接口中使用我定义的类名可以吗?

就不依赖于任何实现而言,这是否会使它减少接口的数量?

我尝试做这样的事情:

public class CustomException {
    /* ... Implementation ... */
}

public interface Interface {

    void onError(CustomException ex);

}

您是否要询问是否可以在接口中继承另一个类?
史努比

@StevieV不,我编辑了问题,看。
nikachx

1
@AndresF。这只是一个示例,可以应用于有关在接口中使用类的任何OO语言。
nikachx

3
告诉我:是CustomException实现的一部分还是接口的一部分?
user253751 '16

2
@nikachx我不明白您所说的“安全”是什么意思。在哪些方面String比这更安全CustomExceptionCustomException反过来又有其他依赖关系又为什么呢?
Andres F.

Answers:


2

首先,我必须指出一个事实,即CustomException它不会扩展,Exception因此它并不是真正的扩展Exception

说:

如果您不关心Dependency Inversion Principle,那么请保持原样。一个接口依赖于具体的类是完全可以的,例如,许多接口依赖于StringObject属于具体的类。事实是,我们倾向于相信属于Java SDK的类比我们编写的类更稳定(更不容易发生代码中断更改)。

另一方面:

如果要遵循DIP(它有很多好处,是我的建议),那么您必须做以下两件事之一:

选项1

  • 使CustomException抽象
  • 保持void onError(CustomException ex)原样

选项2

  • 制作CustomException界面
  • 保持void onError(CustomException ex)原样

使用这些选项中的任何一个,您都将符合DIP,因为该接口将不依赖于任何具体的类,而仅依赖于抽象。

在依赖倒置的直接应用中,摘要归上层/策略层所有。该体系结构将较高/策略组件和定义较低服务的摘要分组在同一程序包中。通过继承/实现这些抽象类或接口来创建较低层。马丁·罗伯特·C·马丁(2003年)。

  • 敏捷软件开发,原则>模式和实践。学徒大厅。第127–131页。ISBN 978-0135974445。

1
接受抽象类或具体(非最终)类之间没有太大区别,并且与接口的区别不超过此。只要实例作为参数传递且在实现中未进行硬编码,就可以为DI奠定基础。
雅各布·赖尔

@JacobRaihle通过传递在实现中进行硬编码的实例是什么意思?
图兰斯·科尔多瓦

我说:“只要它通过并且没有硬编码”。我的意思是,由于Interface接口接受a CustomException并将其留给调用方提供,所以调用方可以自由提供任何扩展的类,CustomException即使CustomException是具体的类也是如此-如果Interface以某种方式负责创建,这是不可能的它。我认为DI就是要实现这种控制反转,而不是使用接口(尽管这当然有帮助)。
雅各布·赖勒

@JacobRaihle “在依赖关系反转的直接应用中,摘要归上层/策略层所有。此体系结构将上层/策略组件和定义了较低服务的摘要归为同一包。创建下层层通过继承/实现这些抽象类或接口。” 马丁·罗伯特·C·马丁(2003年)。敏捷软件开发,原理,模式和实践。学徒大厅。第127–131页。ISBN 978-0135974445。
图兰斯·科尔多瓦

如果可以提供合理的默认值,那么抽象类有什么意义呢?您提供这些会失去什么?想一想,不只是引用书本。
Jacob Raihle

2

Tulains是正确的-接口始终依赖于具体的类。他们只是为了为自己的关注创建合同。该合同可能涉及获取和返回任何类型的数据。

请记住,在高级语言中,即使原始类型也不是那么原始。因此,无论如何,您都在处理具体类型!


0

我想按名称说,您的意思是实际的课程本身。如果您试图指定实际的异常类名称以通过反射来初始化相应的异常,则这不是正确的方法。

如果要在接口中使用自定义类,则当然可以在自己的接口中使用自己的类。这些类成为您的库/ API的公共接口的一部分。数据结构和异常是接口经常使用的类的一个很好的例子。

如果您需要根据上下文使用不同的异常,那么您可能会对使用泛型感兴趣。


不,我不是说反思。就像您提到的那样,可以在接口中使用异常和数据结构,因为它们仅包含数据,而不是平台或依赖于其他类。谢谢。
nikachx

2
提出OP问题的答案...仅在评论中提出,然后提供您的答案。
史努比(Snoop)

1
@StevieV:第一段更多是一个反问。正如OP的评论所示,我实际上回答了OP的问题。
阿森尼·穆尔琴科'16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.