Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 重写类中的方法以修改子类中的方法_Oop_Inheritance_Overriding_Subclass - Fatal编程技术网

Oop 重写类中的方法以修改子类中的方法

Oop 重写类中的方法以修改子类中的方法,oop,inheritance,overriding,subclass,Oop,Inheritance,Overriding,Subclass,ClassA有两个子项:ClassB和ClassC 我们需要重写ClassA的方法,但我们将使用ClassB和ClassC(使用修改后的方法) ClassA、ClassB和ClassC都是我们无法修改的外部库的一部分 在每个子类中使用相同的方法重新实现时,是否可以在不单独子类化ClassB和ClassC的情况下完成此操作 如果ClassB已经重新实现了我们想要忽略的方法,那么问题会有所不同吗?除非有某种特殊机制允许您这样做,否则这是不可能的。如果ClassB有自己的重写实现,也没有什么区别 由于

ClassA
有两个子项:
ClassB
ClassC

我们需要重写
ClassA
的方法,但我们将使用
ClassB
ClassC
(使用修改后的方法)

ClassA
ClassB
ClassC
都是我们无法修改的外部库的一部分

在每个子类中使用相同的方法重新实现时,是否可以在不单独子类化
ClassB
ClassC
的情况下完成此操作


如果
ClassB
已经重新实现了我们想要忽略的方法,那么问题会有所不同吗?

除非有某种特殊机制允许您这样做,否则这是不可能的。如果
ClassB
有自己的重写实现,也没有什么区别

由于已经编译了
ClassB
ClassC
,因此它们的方法的实现已经烘焙到您的外部库中。一般来说,除非您有自己的派生类,否则在源代码级别您无法做任何更改


如果我们谈论的是一种托管语言,它的运行时允许您动态修改调用目标,或者如果一种可以动态重写机器代码的热补丁机制正在发挥作用,那么您可能有一条出路——但这将是一个特殊的例外,而不是规则。

这取决于该语言,这听起来像是一个黑客。如果您是用Javascript编写的,那么可以直接修改类B和C的原型函数


但在大多数C语言中,我认为这是不可能的。多重继承可能会导致歧义(我想B和C都有自己的子类),因此您可能必须对每个子类进行子类化。

令人失望的是,在我的特殊情况下,这意味着复制粘贴约60行源代码:(在协议的特定情况下,有一个类似的问题