在java的抽象类中实现助手函数的最佳方法是什么?

jc3wubiy  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(298)

关闭。这个问题是基于意见的。它目前不接受答案。
**想改进这个问题吗?**更新这个问题,这样就可以通过编辑这篇文章用事实和引文来回答。

上个月关门了。
改进这个问题
假设我们有一个抽象类(我们称它为x),它由许多类继承(我们现在称它们为a和b)。从x继承的每个类都做相似但略有不同的事情,因此尽管它们的每个公共方法的实现可能略有不同,但它们都可以使用相同的helper函数来避免重复代码。但是,任何不是x的子类的类都不能访问这些helper函数。
此外,如果有许多helper函数只打算在扩展x的类内部使用,但每个类中需要有稍微不同的实现,该怎么办?
举个例子:

public abstract class X {
    public abstract void doStuff();

    int helperFunction(int a, int b) {
        return a + b;
    }

    abstract void secondHelperFunction(int x);
}

public class A extends X {
    @Override
    public void doStuff() {
        //do some stuff
        helperFunction(a, b);
        //so some other stuff
    }

    @Override
    void secondHelperFunction(int x) {
         //implementation A
    }
}

public class B extends X {
    @Override
    public void doStuff() {
        //do some different stuff
        helperFunction(b, a);
        //do other stuff
    }

    @Override
    void secondHelperFunction(int x) {
        //implementation B
    }
}

(这个例子显然很简单,我只是想把我的观点讲清楚)
我的问题是,最好的办法是什么?例如,helper函数应该使用什么访问修饰符?显然private不是一个选项,因为这样子类就不能使用它了。default和protected听起来是更好的选择,但是它们仍然允许非子类使用这些函数,只要它们与x在同一个包中。那么,解决这个问题的最佳方案是将x和从x继承的所有类封装在它们自己的包中,与程序的其余部分分开吗?或者应该研究另一种抽象形式,例如接口(尽管我想不出一种方法来处理这个问题(特别是使用接口)

ohtdti5x

ohtdti5x1#

您可以考虑以下几个选项:
使用 protected . 正确的是,这不会阻止同一包中的其他类调用该方法。但这真的是个问题吗?包的思想是将相关类聚集在一起,并控制调用它们的接口。访问修饰符是一种相对粗糙的控制机制,主要用于帮助人们在编码时避免错误。
将助手函数放在一个单独的类中,并使用组合而不是继承。您仍然可以重写方法以提供不同的行为。缺点是需要传入所需的任何值。但这并不一定是坏事,因为它清楚地表明了依赖关系。

相关问题