当前位置: 首页 > 面试题库 >

用子接口作为新参数覆盖方法参数

江同化
2023-03-14
问题内容

我不知道为什么此代码在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