我有一个A类扩展B类。 我的B班有5种抽象方法。在所有这5种方法中,我需要对methodA()进行一次调用。这个问题是因为我需要创建40个扩展classB的类,我需要为methodA编写相同的调用,每个类和所有这40个类编写5次。 所以我最终写了对methodA的调用,大约200次。
现在我该如何设计这个,以便我不需要在子类级别进行这些调用?
以下示例
此处的methodA是一种在数据库中记录用户操作的方法。 所以每次我创建一个扩展类B的类时,在所有5个抽象方法中,我需要调用一个方法A来记录用户在数据库中的操作。
由于
答案 0 :(得分:4)
你可以使用这样的模式:
abstract public class B {
/** Override to implement the subclass logic */
abstract protected SomeClass reallyCalculateStuff();
/** The public API method to be called by clients of the class */
final public SomeClass calculateStuff() {
executeSharedCode();
return reallyCalculateStuff();
}
/** The method all other methods need to call */
private void executeSharedCode() {
// ...
}
}
public class A extends B {
@Override
protected SomeClass reallyCalculateStuff() {
// ...
}
}
你显然想要提出更好的名字。但这个想法是基类已经包含公共API并负责调用共享方法。
如果executeSharedCode
需要在每个子类中以不同方式实现,这也会有效。只需将其设为abstract
。
但是,根据用例,可能有更好的替代方案。例如,拦截器。重新考虑设计可能也是值得的,因为可以通过不同地设计类来避免这种模式。但是如果没有背景,所有这些事情都无法判断,所以我只是给你这种模式。
答案 1 :(得分:0)
如果要减少代码复制,可以使B中的方法非抽象,并为它们提供方法体。这意味着它们不再是抽象的,但由于所有子类都将继承此行为,您仍然可以放心,它们都将能够使用该方法。因此,B中的方法可以调用methodA(),即使在子类中定义了methodA,如果它们需要唯一的行为,它们也可以被子类覆盖。
答案 2 :(得分:0)
不幸的是,没有办法从根本上打电话给父母的身体'方法。您需要使用super
明确一点。
您的父班:
public class B {
public methodA() {}
public firstMethod() {
methodA();
}
}
您的实施:
public class A extends B {
public firstMethod() {
super.firstMethod();
// method body
}
}
因此,您仍然需要在实现中调用super.firstMethod
,但至少在这种情况下,您可以拥有比单个方法调用更广泛的默认实现。