我不知道为什么此代码在PHP中不起作用?
<?php
interface Engine {
function run();
}
interface HydroEngine extends Engine {
function run();
}
interface Car {
function setEngine(Engine $engine);
}
interface WaterCar extends Car {
function setEngine(HydroEngine $engine);
}
?>
看来它没有违反任何OOP规则,但是为什么它给我一个错误?
Fatal error: Declaration of WaterCar::setEngine() must be compatible with Car::setEngine(Engine $engine)
它 确实
违反了SOLID规则。您声明Car::setEngine
接受一个类型的参数Engine
,但子级WaterCar::setEngine
接受一个类型的参数HydroEngine
。即使HydroEngine
是的子类型Engine
,它仍然是不同的类型。
当上课的时候Foo implements WaterCar
,上课也是正确的instanceof Car
。但是Foo::setEngine
接受一个HydroEngine
,但是不接受一个Engine
。因此,Foo::setEngine
据推测implements Car
,但不接受type参数Engine
。这打破了Liskov替代原则。您不能在子接口,周期中更改参数的类型。
继承的关键字是明确的 extends
。子类与父类 完全相同 ,甚至可能 更多 。它不能做的比父项 少
。既然HydroEngine
是一个专门亚型Engine
,这将意味着一个WaterCar
不 小于
比Car
,因为它只接受的更窄的亚型Engine
。例如:
function (Car $car) {
$engine = new EngineImplementation;
$car->setEngine($engine);
}
如果您传入,则上面的代码会崩溃WaterCar
,因为它不接受Engine
。
问题内容: 我几天前接受采访时,被问到这样的问题。 问:反向链接列表。给出以下代码: 我很困惑,因为我不知道接口对象可以用作方法参数。面试官解释了一下,但我仍然不确定。有人可以启发我吗? 问题答案: 实际上,这是使用接口的最常见和最有用的方法之一。该接口定义了一个契约,您的代码可以与实现该接口的任何类一起使用,而无需了解具体的类- 它甚至可以与编写代码时尚不存在的类一起使用。 Java标准API中
在编写了自己的通用功能接口并将其用于lambdas之后,我必须在一种新方法中使用它: 将通用数组作为输入处理,检查其最小长度是否为4 处理我的功能界面的任何实例 处理lambda表达式的任何实例,该表达式接受一个参数,但不返回任何内容 应用于函数接口实例的结果(这里我想我必须使用使用者) 以前从未使用过函数接口,有人能解释一下我应该如何将2个函数接口作为方法参数传递吗? 例如:
问题内容: 我是Go编程语言的新手,最近遇到了以下代码: 但是,我不理解函数签名背后的含义。它接受接口作为参数。你能解释一下这是怎么回事吗?谢谢 问题答案: Go使用接口来泛化类型。因此,如果您想要一个带有特定接口的函数,则可以编写 可以将满足的每种类型传递给。 现在,可以如下所示: 为了满足,实现它的类型必须实现。 但是,如果您需要一个空接口(),则该对象不需要实现要传递给该函数的任何方法: 上
在这个特定的示例中,我扩展了
B类: 如何影响这个界面?
我目前正在做一个项目,在这个项目中,我们有一个jenkins实例与一个单独的网站并排运行,工作流程是这样的,用户需要点击网站中的链接,从而触发jenkins实例中的jenkins作业。 触发的jenkins作业有几十个参数,我们目前正在做的是,该网站将使用javascript构建一个如下URL: https://JENKINS_HOST/作业/JOB_NAME/build with Paramet