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_Class_Inheritance_Overriding_Method Hiding - Fatal编程技术网

Oop 可以通过向下转换到超类来防止方法重写吗?

Oop 可以通过向下转换到超类来防止方法重写吗?,oop,class,inheritance,overriding,method-hiding,Oop,Class,Inheritance,Overriding,Method Hiding,我试图了解以下问题的答案是否在所有主要的OOP语言中都是相同的;如果不是,那么这些语言有什么不同呢 假设我有一个类A,它定义了方法act和jump;方法act调用方法jumpA的子类B重写方法jump(即,使用适当的语法确保每当调用jump时,都使用类B中的实现) 我有类b的对象b。我希望它的行为与类A完全相同。换句话说,我希望使用A中的实现执行跳转。我在不同语言中有哪些选择 例如,我可以通过某种形式的向下投射来实现这一点吗?或者通过创建一个知道调用哪些方法的代理对象 我希望避免创建一个全新的a

我试图了解以下问题的答案是否在所有主要的OOP语言中都是相同的;如果不是,那么这些语言有什么不同呢

假设我有一个类
A
,它定义了方法
act
jump
;方法
act
调用方法
jump
A
的子类
B
重写方法
jump
(即,使用适当的语法确保每当调用
jump
时,都使用类
B
中的实现)

我有类
b
的对象
b
。我希望它的行为与类
A
完全相同。换句话说,我希望使用
A
中的实现执行
跳转。我在不同语言中有哪些选择

例如,我可以通过某种形式的向下投射来实现这一点吗?或者通过创建一个知道调用哪些方法的代理对象

我希望避免创建一个全新的
a
类对象,并小心地设置
a
b
之间的内部状态共享,因为这显然不是未来的证明,而且很复杂。我还希望避免将
b
的状态复制到类
a
的全新对象中,因为可能需要复制大量数据

更新

我问了这个问题,但这似乎是不可能在Python中实现的,从技术上讲,这是可以做到的。。。有点


看起来,除了技术可行性之外,从设计角度来看,有一个强有力的理由反对这样做。我是在问这个问题。

你所问的与OOP编程完全无关/不受支持

如果您对对象<代码> <代码> >类<代码> b>代码>并重写其方法,当创建了<代码> b>代码>的具体实例时,基本方法的所有重写/新实现都与它相关(我们谈论java或C++与虚拟表等)。p> 您已实例化对象

B

如果您已经重写了超类的方法,为什么您希望您能够/将会/应该能够调用该方法

当然,您可以明确地调用它,例如,在方法内部调用
super
,但您不能自动执行此操作,强制转换也不能帮助您执行此操作

我无法想象你为什么要这么做。
如果需要使用class
A
,请使用class
A


如果需要覆盖其功能,请使用其子类
B

您所问的问题与OOP编程完全无关/不受支持

如果您对对象<代码> <代码> >类<代码> b>代码>并重写其方法,当创建了<代码> b>代码>的具体实例时,基本方法的所有重写/新实现都与它相关(我们谈论java或C++与虚拟表等)。p> 您已实例化对象

B

如果您已经重写了超类的方法,为什么您希望您能够/将会/应该能够调用该方法

当然,您可以明确地调用它,例如,在方法内部调用
super
,但您不能自动执行此操作,强制转换也不能帮助您执行此操作

我无法想象你为什么要这么做。
如果需要使用class
A
,请使用class
A


如果需要覆盖其功能,请使用其子类
B

大多数编程语言在支持虚拟函数的动态分派(在子类而不是父类的实现中调用重写的方法
jump
)时都会遇到一些麻烦,以至于很难解决或避免它。一般来说,专门化/多态性是一个可取的特性——可以说是OOP的首要目标

请看Wikipedia关于的文章,它提供了许多编程语言中对虚拟函数的支持的有用概述。考虑到特定的语言,它会给你一个开始的地方,同时也可以看到当程序员能够控制调度行为时,如何权衡(参见C++的章节)。
因此,你的问题的答案是,“不,在所有编程语言中,行为都不一样。”此外,没有独立于语言的解决方案。如果您的强>需要< /强>行为,C++可能是您的最佳选择。

< P>大多数编程语言都会遇到一些麻烦来支持虚拟函数的动态调度(在子类中调用重写方法<代码>跳转<代码>的情况,而不是父类的实现)--在一定程度上,围绕它工作或避免它是困难的。一般来说,专门化/多态性是一个可取的特性——可以说是OOP的首要目标

请看Wikipedia关于的文章,它提供了许多编程语言中对虚拟函数的支持的有用概述。考虑到特定的语言,它会给你一个开始的地方,同时也可以看到当程序员能够控制调度行为时,如何权衡(参见C++的章节)。
因此,你的问题的答案是,“不,在所有编程语言中,行为都不一样。”此外,没有独立于语言的解决方案。C++可能是你最好的选择,如果你需要“<强”>行为。

你可以用python(排序)来做这件事,有些骇人听闻的黑客。它要求您实现与我们在第一个Python特定问题中讨论的包装器类似的东西,但作为B的子类。然后您还需要实现写代理(包装器对象应该是