Oop 可以通过向下转换到超类来防止方法重写吗?
我试图了解以下问题的答案是否在所有主要的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
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
,但您不能自动执行此操作,强制转换也不能帮助您执行此操作
我无法想象你为什么要这么做。
如果需要使用classA
,请使用classA
如果需要覆盖其功能,请使用其子类B
您所问的问题与OOP编程完全无关/不受支持
如果您对对象<代码> <代码> >类<代码> b>代码>并重写其方法,当创建了<代码> b>代码>的具体实例时,基本方法的所有重写/新实现都与它相关(我们谈论java或C++与虚拟表等)。p>
您已实例化对象
B
如果您已经重写了超类的方法,为什么您希望您能够/将会/应该能够调用该方法
当然,您可以明确地调用它,例如,在方法内部调用super
,但您不能自动执行此操作,强制转换也不能帮助您执行此操作
我无法想象你为什么要这么做。
如果需要使用classA
,请使用classA
如果需要覆盖其功能,请使用其子类B
大多数编程语言在支持虚拟函数的动态分派(在子类而不是父类的实现中调用重写的方法jump
)时都会遇到一些麻烦,以至于很难解决或避免它。一般来说,专门化/多态性是一个可取的特性——可以说是OOP的首要目标
请看Wikipedia关于的文章,它提供了许多编程语言中对虚拟函数的支持的有用概述。考虑到特定的语言,它会给你一个开始的地方,同时也可以看到当程序员能够控制调度行为时,如何权衡(参见C++的章节)。
因此,你的问题的答案是,“不,在所有编程语言中,行为都不一样。”此外,没有独立于语言的解决方案。如果您的强>需要< /强>行为,C++可能是您的最佳选择。< P>大多数编程语言都会遇到一些麻烦来支持虚拟函数的动态调度(在子类中调用重写方法<代码>跳转<代码>的情况,而不是父类的实现)--在一定程度上,围绕它工作或避免它是困难的。一般来说,专门化/多态性是一个可取的特性——可以说是OOP的首要目标
请看Wikipedia关于的文章,它提供了许多编程语言中对虚拟函数的支持的有用概述。考虑到特定的语言,它会给你一个开始的地方,同时也可以看到当程序员能够控制调度行为时,如何权衡(参见C++的章节)。
因此,你的问题的答案是,“不,在所有编程语言中,行为都不一样。”此外,没有独立于语言的解决方案。C++可能是你最好的选择,如果你需要“<强”>行为。 你可以用python(排序)来做这件事,有些骇人听闻的黑客。它要求您实现与我们在第一个Python特定问题中讨论的包装器类似的东西,但作为B的子类。然后您还需要实现写代理(包装器对象应该是