Java - 包含变量的抽象类?

32

让抽象类定义实例变量是一种好的做法吗?

public abstract class ExternalScript extends Script {

    String source;

    public abstract void setSource(String file);

    public abstract String getSource();
}

外部JavaScript类ExternalJavaScript.class将自动获取源变量,但我认为,如果所有子类自己定义源,而不是从继承中获得,那么代码更容易阅读。

你的建议是什么?

/Adam

3个回答

38

我本以为这样做会更好,因为您正在添加一个变量,那么为什么不限制访问并使其更清晰呢?您的getter / setters应该按照其名称所说的那样执行。

public abstract class ExternalScript extends Script {

    private String source;

    public void setSource(String file) {
        source = file;
    }

    public String getSource() {
        return source;
    }
}

回到问题的核心,当你阅读 getter/setter 代码时,你是否会关注它们的位置?如果它们只是用于获取和设置,那么在阅读代码时就不需要担心函数“做了什么”。还有其他一些需要考虑的原因:

  • 如果源受保护(因此可以被子类访问),那么代码会变得混乱:谁改变了变量?如果它是一个对象,那么当你需要重构时,这将变得困难,而方法则更容易实现这一步骤。
  • 如果你的 getter/setter 方法并不是用来获取和设置,那么就要描述它们为其他东西。

始终考虑你的类是否真的是一个不同的东西,这应该有助于决定是否需要更多内容。


11
当然可以。为了存储和维护的效率,抽象基类只是一个方便集成2个或更多类通用行为和数据的地方。这是一种实现细节。
但要注意,您不应该在应该使用接口的地方使用抽象基类。请参考接口 vs 基类

3

当然。抽象类的整个概念是它们可以包含一些行为或数据,你要求所有子类都包含这些内容。想象一个简单的例子—— WheeledVehicle,它应该有一个numWheels成员变量。你希望所有子类都有这个变量。请记住,在开发API时,抽象类是非常有用的特性,因为它们可以确保扩展您的API的人不会破坏它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接