函数参数:抽象 class 还是接口?

Function argument: abstract class or interface?

假设有这个 class 图,在 Java:

<Interface>   <AbstractClass>      <ConcreteClass>      

                                   Γ SomethingImpl1
ISomething <- AbstractSomething <--|
                                   L SomethingImpl2

我想知道采用 Something 的函数参数应该是什么类型。

ICity(依此类推...)和 ILocation。如果ILocation有设置城市的功能,例如:

void setCity(X city);

X 应该是什么? ICity 还是 AbstractCity?正确的签名是什么?

ISomething/ICity 是参数的正确类型,前提是该方法只需要接口提供的功能(通常应该是这种情况)。总的来说:

  1. 编码到你能做到的最小界面,

  2. 在 Java 中,尽可能将其设为 interface(就像您所做的那样);这样,如果有充分的理由通过 AbstractSomething/AbstractCity 实现它 而不是 ,您可以,并且仍然可以将它与该方法一起使用。