与不需要的方法接口
Interface with not-required methods
有没有办法在接口中指示可选方法(以便合同仅指示要给出的参数的数量/类型)?
请对问题多加一点理解和洞察,并指出解决方案?例如,请参阅此讨论:Optional Methods in Java Interface
在应用程序中,我正在使用连接到持久性(原则)的监听器。所以我正在使用其中一些方法:
prePersist()
preUpdate()
postPersist()
postUpdate()
等等
现在,在重构时,由于实体(要持久化的对象)太多,我决定将这些方法的各个部分拆分成单独的 类。
然而,并非所有这些都需要所有预...和post-...方法。我需要确保为他们提供适当数量和类型的参数。 PHP 是怎么做到的?
没有。接口的整个想法是有一个保证方法存在的契约。
但是一个 class 可以实现多个接口,所以你可以定义一个包含该方法的不同接口,而不是将该接口添加到没有该方法的 class 中。
接口不能有可选方法。这就是接口背后的概念。但是,如果您需要一些可选的东西,那么我建议另外创建您的接口的默认实现,然后您需要的所有 classes 都会扩展。这样,所有这些 classes 都将实现接口,您还可以仅覆盖选定的方法,具有您的可选行为。
类似的东西:
interface MyInterface {
public function method1();
public function method2();
}
然后 Base class 实现您的接口方法(我将其抽象化以禁止直接使用):
abstract class Base implements MyInterface {
public function method1() {
// dummy
}
public function method2() {
// dummy
}
}
然后:
class Optional extends Base {
// method1 is not overridden, so Base' implementation applies
public function method2() {
// something here
}
}
阅读您的评论和互联网后,我决定为应用程序设计选择另一种解决方法。
我创建了一个包含所有(必需和可选)方法的接口。增加接口数量来完成一项简单的任务(尤其是在提到的情况下)我认为这是一种非常糟糕的方法。这是因为 我相信 class 和接口的想法是将连接的事物保持在一起,而不是将它们 "artificially" 拆分为单独的 "containers".(例如,考虑 PHP 中的 POPO / Java 中的 POJO)。
现在,所有 classes 都需要实现所有潜在的方法,但其中一些可能是空的,或者抛出异常,如上面给出的 link 的讨论中所指出的,或者GolezTrol 在他的评论中。无论如何,感谢您的关注。
我发现了一个介绍 WeakInterfaces 的有趣图书馆。但是我认为让它与 Doctrine 一起工作并不容易。
请看这里的例子:
interface Workable
{
public function work();
}
interface Feedable
{
public function eat();
}
interface Employee extends Feedable, Workable
{
}
class Human implements Employee
{
public function work()
{
// ....working
}
public function eat()
{
//.... eating in lunch break
}
}
// robot can only work
class Robot implements Workable
{
public function work()
{
// ....working
}
}
有没有办法在接口中指示可选方法(以便合同仅指示要给出的参数的数量/类型)?
请对问题多加一点理解和洞察,并指出解决方案?例如,请参阅此讨论:Optional Methods in Java Interface
在应用程序中,我正在使用连接到持久性(原则)的监听器。所以我正在使用其中一些方法:
prePersist()
preUpdate()
postPersist()
postUpdate()
等等
现在,在重构时,由于实体(要持久化的对象)太多,我决定将这些方法的各个部分拆分成单独的 类。
然而,并非所有这些都需要所有预...和post-...方法。我需要确保为他们提供适当数量和类型的参数。 PHP 是怎么做到的?
没有。接口的整个想法是有一个保证方法存在的契约。
但是一个 class 可以实现多个接口,所以你可以定义一个包含该方法的不同接口,而不是将该接口添加到没有该方法的 class 中。
接口不能有可选方法。这就是接口背后的概念。但是,如果您需要一些可选的东西,那么我建议另外创建您的接口的默认实现,然后您需要的所有 classes 都会扩展。这样,所有这些 classes 都将实现接口,您还可以仅覆盖选定的方法,具有您的可选行为。
类似的东西:
interface MyInterface {
public function method1();
public function method2();
}
然后 Base class 实现您的接口方法(我将其抽象化以禁止直接使用):
abstract class Base implements MyInterface {
public function method1() {
// dummy
}
public function method2() {
// dummy
}
}
然后:
class Optional extends Base {
// method1 is not overridden, so Base' implementation applies
public function method2() {
// something here
}
}
阅读您的评论和互联网后,我决定为应用程序设计选择另一种解决方法。
我创建了一个包含所有(必需和可选)方法的接口。增加接口数量来完成一项简单的任务(尤其是在提到的情况下)我认为这是一种非常糟糕的方法。这是因为 我相信 class 和接口的想法是将连接的事物保持在一起,而不是将它们 "artificially" 拆分为单独的 "containers".(例如,考虑 PHP 中的 POPO / Java 中的 POJO)。
现在,所有 classes 都需要实现所有潜在的方法,但其中一些可能是空的,或者抛出异常,如上面给出的 link 的讨论中所指出的,或者GolezTrol 在他的评论中。无论如何,感谢您的关注。
我发现了一个介绍 WeakInterfaces 的有趣图书馆。但是我认为让它与 Doctrine 一起工作并不容易。
请看这里的例子:
interface Workable
{
public function work();
}
interface Feedable
{
public function eat();
}
interface Employee extends Feedable, Workable
{
}
class Human implements Employee
{
public function work()
{
// ....working
}
public function eat()
{
//.... eating in lunch break
}
}
// robot can only work
class Robot implements Workable
{
public function work()
{
// ....working
}
}