我正在尝试扩展一个类并覆盖其中一个方法。我们调用那个类A.我的类B类覆盖了一个受保护的方法。 C类扩展了A类,D类扩展了C类。在D类中,我试图覆盖的方法也在这里扩展,调用parent :: mymethodimoverriding。这个方法在C类中不存在,所以它在A类中存在。这就是我在B类中重复的方法,显然你不能用B扩展A并让这些变化显示在D中,因为它不会掉落符合类层次结构。我可能错了,请你纠正我。
所以如果我的类b被调用并运行,那么D类被调用它运行A中的方法并覆盖我设置的内容。我认为必须有办法让这个工作,我只是遗漏了一些东西。
这是一个例子,正如你在A类中看到的那样,有一个对setTitle的调用,并且它被设置为“Example”在我的类中我将它设置为“NewExample”。我的类在D类之前被调用,因此当调用D类时,它会返回到父级并将标题设置回“Example”。我想要发生的是B类运行并将其设置为我需要它然后进行D类运行,而不是它击中我正在扩展的类来代替我的类。事情是我不认为我可以让D级扩展我的课程。所以现在它正在达到我正在扩展的课程
class A{
protected function _thefunction(){
setTitle("Example");
}
}
class B extends A{
protected function _thefunction(){
My new code here
setTitle("NewExample");
}
}
class C extends A{
nothing that matters in here for what I am doing
}
class D extends C{
protected function _thefunction(){
parent::_thefunction();
additional code here
}
}
我试过
class D extends C{
protected function _thefunction(){
B::_thefunction();
additional code here
}
}
我得到的错误不是静态方法
答案 0 :(得分:2)
从我能理解的_thefunction()对另一个对象($ headBlock?)做了一些事情。你的班级(B)改变了那个对象的东西,然后D级去了,然后把它改回别的东西。解决这个问题的唯一方法是以某种方式禁用D的干扰或让B类的方法在它之后运行。
你可以通过让C继承B而不是A来使用继承,虽然我不知道它们可能对你的程序结构有什么副作用。
编辑:看到这是我们正在谈论的Magento,也许你应该在SO或Magento论坛中专门询问Magento。你无法覆盖它;也许你的方法在某处出现了错误的转折?
答案 1 :(得分:1)
这是我在B类中重复的方法,显然你不能用B扩展A并且在D中显示这些更改,因为它不符合类层次结构。我可能错了,请你纠正我。
我担心你就在这里。如果你不重写整个概念,你就无能为力。
我尝试通过调用myclass :: thefunction来禁用干扰,但当然我得到一个错误,说它不是静态方法。
你能修改D级吗?我不明白这一部分。如果是这样的话,我认为你首先不会问这个问题。
也许有关Magento的一些细节可能有帮助吗?可能还有其他方法可以达到预期的效果。
答案 2 :(得分:1)
至少有两个原因可能无法完成你想要做的事情:
答案 3 :(得分:1)
您正在尝试调用B :: _ theFunciton(),但B中的方法受到保护(意味着对该方法的所有访问都是为其自己的类或任何子类保留的,D不是,D的类层次结构是...... A-> C-> D,其中没有B.)
该函数也不是静态的,所以你不能像B :: blah()
那样引用它如果您真的想要这个,那么您可以将_theFunction定义为公共静态,但是如果您真的认为这是一个与对象相关的方法,那么唯一好的做法就是成为它的子类。