PHP Object Interfaces上的手册说:
实现接口的类必须使用与接口中定义的完全相同的方法签名。不这样做会导致致命的错误。
不考虑以下情况:我有一个界面
interface Foo
{
public function foo(SpecialClass $object);
}
其中只包含一个方法foo
,它以SpecialClass
为参数,具体类
class Bar
{
public function foo(BaseClass $object)
{
// do something with $object
}
}
与Foo
具有foo
相同的签名,但BaseClass
占用SpecialClass implements BaseClass
,Foo
。
Bar
接口,我就可以使用Bar
的实例,一切都应该工作(因为SpecialClass是一个BaseClass)。换句话说,Foo
满足foo
声明的合同,因为它有一个能够处理任何SpecialClass
对象的方法Bar implements Foo
。
为了使它明确,并且能够在我的代码中实际使用它,我希望能够编写question1 type1
question2 type2
...
,但是,正如文档中所述,这会引发致命的错误。
这个致命错误的原因是什么?是因为目前事情是这样完成的还是有特定的理由以这种方式做事?
答案 0 :(得分:1)
DateTime不是StdClass,它们实际上是两个不同的类。
这不是Java,每个人都从Object
扩展答案 1 :(得分:0)
正如@dynamic DataTime
所述,stdClass
不是class A {
public function foo();
}
class B extends A {
public function foo();
public function bar();
}
interface C {
public function baz(B $obj)
}
class D implements C {
public function baz(A $obj);
}
。看一下下面的例子。
C
您可以看到baz
接口的函数B
接受参数A
。然而,实现需要参数B
。问题是A
具有更多扩展接口,C
不满足它。换句话说,foo()
界面需要访问bar()
和A
。但foo()
只有B
。如果情况正好相反,那么事情会起作用 - A
满足 Process.Start("C:\Program Files\7-Zip\7z.exe", "a -tzip" + (ChosenFile & "\" & "SavedFiles") + NewFileName1)
的界面。
所以这不是暂时的行为,而且是正确的行为。