【发布时间】:2017-10-18 04:32:04
【问题描述】:
我正在尝试为我的服务类创建一个通用接口。我在使用接口的两个类时遇到问题。他们共享一个名为 create 的方法。 create 方法除了三个参数。我希望它使第三个参数是可选的,以便两个类都可以使用它。
interface ServiceInterface{
public static function create($var1, $var2, $thisOneIsOptional);
}
class ServiceObject1 implements ServiceInterface{
public static function create($url, $server){
//....
}
}
class ServiceObject2 implements ServiceInterface{
public static function create($methode, $url, $id){
//....
}
}
【问题讨论】:
-
拥有一个允许以不同方式使用该方法的界面听起来有点违反直觉。接口的全部目的是确切地知道如何使用实现类。如果一项服务不需要
$id而另一项需要,则仍应需要它。然后由服务来忽略它。 -
公共静态函数 create($var1, $var2, $thisOneIsOptional = '');或者如果数组公共静态函数 create($var1, $var2, $thisOneIsOptional = []);
-
你不能有一个带有可选参数的接口和一个需要它的实现——这意味着签名不兼容。如果你不能将你的接口概括到足以适应所有可能的实现,那么接口就不是你想要的。
-
那么您不知道每个服务需要或不需要哪些参数,而无需实际查看每个服务的代码。那么,为什么还要为界面烦恼呢?
-
static方法的接口......无论如何都很奇怪。针对接口进行编码意味着您可以将对象替换为其他对象。但是,静态方法总是在特定类上调用,不能注入/替换。那么……为什么首先要有一个界面?