java 类 覆盖,关于java:如何覆盖调用超类’超类方法的方法?

在Java编程中,当无法修改父类或祖父母类时,如何在子类中重写方法以调用祖父母类的实现是一个挑战。博客讨论了这个问题,提出了一些解决方案,包括使用final辅助方法、创建祖父母类的本地实例或者通过添加新的方法来间接调用所需实现。这些方法都是在不直接支持super.super.method()的情况下,尝试保持代码的封装性和功能性的权宜之计。
摘要由CSDN通过智能技术生成

本问题已经有最佳答案,请猛点这里访问。

我的一部分人认为这不可能(即使可能),但我还是会问。

鉴于以下类层次结构(Grandparent和Parent来自第三方,因此不在我的控制之下),我如何在Child中重写myMethod()以便它绕过Parent中被重写的实现并调用Grandparent中的实现?

class Grandparent {

public void myMethod() {

// do stuff

}

}

class Parent extends Grandparent {

@Override public void myMethod() {

super.myMethod();

// do something else

}

}

class Child extends Parent {

@Override public void myMethod() {

// ??? I want to *only* do what Grandparent did here

}

}

假设Parent类提供了许多其他有用的行为,并且是Child层次结构的一个关键元素(换句话说,我不希望"使Child成为Grandparent的子类")。

stackoverflow.com/questions/586363/…的副本。

是的,因为同样的原因被选为二人组。

投票关闭-复制。

尽管另一个问题很好地解释了为什么我不能使用super.super.mymethod(),但它并没有为我提供任何关于如何解决我的特定问题的明确指导。我相信我的问题有一个不同的答案,比如"继承的封装"。

但你说得对,这已经够蠢了…对不起,我找不到。

继承背后的思想是,每个类都定义了它们需要的方法,因此您不需要检查任何代码。

似乎您在这里进行子类化只是为了重用代码,而这不是子类化的概念。

也许您应该有一个助手成员来完成一些您需要的任务,而不是子类化,并且让"child"和"parent"类同时扩展"graphrent"。

你需要问自己的主要问题是:"孩子真的是父母、祖父母或邻居的后代吗?"换句话说,对于孩子的每一个例子,我能说它是父母吗?

如果答案是否定的,那么你的子类化就错了:继承应该意味着某种东西,而不仅仅是代码重用(即福特也是一辆汽车,而不仅仅是"福特"使用"汽车"方法)。

假设我无法接触到父母或祖父母的密码,假设我没有,正如SEB所建议的(史蒂夫显然同意的),只是完全滥用了继承权:

我将创建一个祖父对象的本地实例(或者一个扩展祖父的本地类,如果它是抽象的),并直接访问它对mymethod()的解释。当然,根据MyMethod()应该读取和/或操作多少状态信息,所涉及的工作量可以是从"简单"到"痛苦"的任何内容。

这是一个丑陋的解决方案,而且,取决于访问了多少状态信息,可能会像地狱一样脆弱。但如果祖父是可靠稳定的和/或mymethod()是相当独立的,它就可以工作。魔鬼总是在细节上。

我完全同意SEB的观点,这是重复使用,而不是继承。但是,嘿。重复使用通常是一件好事。

委托而不是继承+1

你能控制父类吗?

如果是这样,可以向对祖辈调用MyMethod的父级添加方法(MyNewMethod)并从子级调用MyNewMethod吗?

(我不是Java人,所以不知道您是否只能从子类中的方法中调用超类中的方法)

class Grandparent {

public void myMethod() {

myHelperMethod();

}

}

class Parent extends Grandparent {

@Override public void myMethod() {

super.myMethod();

// do something else

}

public final void myNewMethod() {

super.myMethod();

}

}

class Child extends Parent {

@Override public void myMethod() {

// ??? I want to *only* do what Grandparent did here

myNewMethod();

}

}

不可能。

我将在祖父母中创建一个final助手方法。并让这个方法(被重写)调用那个助手。

class Grandparent {

public final void myHelperMethod() {

// do stuff

}

public void myMethod() {

myHelperMethod();

}

}

class Parent extends Grandparent {

@Override public void myMethod() {

super.myMethod();

// do something else

}

}

class Child extends Parent {

@Override public void myMethod() {

// ??? I want to *only* do what Grandparent did here

myHelperMethod();

}

}

谢谢。我正在考虑做类似的事情,但是由于我没有祖父母类的"控制权",所以我必须有效地自己重新实现该方法。

@史蒂夫·里德:如果你只能控制儿童班,那你就没别的办法了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值