我正在使用具有“ Exchange”基类的第三方库。我想在不编辑基类的情况下将自己的公共方法添加到基类中(因此无法幸免升级)。我已经阅读了一些有关继承的内容,但只能想到以下三种实现方式:
很明显,所有3个解决方案都需要编辑第三方代码,这意味着它在代码更新后将无法生存。
我是一个初学者,因此,如果您有解决方案,请提供一个冗长的答案,并在必要时提供基本代码。
谢谢。
编辑:根据答复,我意识到我已经遗漏了一个非常重要的约束。我的代码没有直接使用基类。我的代码使用扩展“ Exchange”的子类,它们也是同一第三方程序包的一部分,因此我必须编辑每个子类以使用扩展的Exchange。子类与父类都属于同一包,因此仍然存在更新覆盖的问题。
答案 0 :(得分:1)
您应该继承Exchange
并将您的公共/自定义代码添加到自定义类中。
例如:CustomExchage扩展了Exchange。
更新: 即使您需要使用第三方子类:解决方案也一样。从该子类(或通常从最特定的类)扩展
这可能会阻止您进行库更新。每次库的维护者更新代码时,都必须将自定义代码添加回Exchange
类。考虑自动化部署:如果有更新,您可能不会意识到,更新可能会破坏应用程序的代码。
更强的扩展理由:您的自定义代码可能不属于基类(简单来说)。
答案 1 :(得分:1)
此答案取决于交换的结构(一切都可能是私有的,无法访问),但是您可以扩展该类。
class YourExchange extends Exchange {
public function yourMethod() {}
}
然后您可以使用您的课程而不是Exchange。
再次,可能需要重复一些,这取决于最终的私有/受保护/公共或Exchange的内容。
一个示例是,如果Exchange具有private function fooBar()
,您的新方法可能想要访问它,但由于private
而不能。因此,说“哦,是的,只是扩大班级”可能并不像人们看到的那样直接。
答案 2 :(得分:0)
最好的选择是第三种解决方案。您可以做的是创建扩展Exchange的基类,如下所示:
class MyExchange extends Exchange {
public function myMethod () {
}
}
然后将此类用作您自己的类的父级,如下所示:
class MyChildExchange extends MyExchange {
//implement your method here
public function myOtherMethod() {
// call parent function
$this->myMethod();
}
}
答案 3 :(得分:-1)
PHP不允许在运行时向类添加方法,您应该编辑Exchange类或使自己的类继承自Exchange类。