30

让抽象类定义实例变量是一种好习惯吗?

public abstract class ExternalScript extends Script {

    String source;

    public abstract void setSource(String file);

    public abstract String getSource();
}

子类 ExternalJavaScript.class 然后会自动获取源变量,但我觉得如果所有子类自己定义源而不是继承,则代码更容易阅读。

你有什么建议?

/亚当

4

3 回答 3

35

我会认为这样的事情会好得多,因为您要添加一个变量,那么为什么不限制访问并使其更清洁呢?你的 getter/setter 应该按照他们在罐子上说的去做。

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 方法没有获取和设置,则将它们描述为其他内容。

总是想你的课是否真的是一个不同的东西,这应该有助于决定你是否需要更多的东西。

于 2008-10-25T10:52:28.303 回答
9

当然……为什么不呢?
抽象基类只是为了方便将 2 个或多个类共有的行为和数据存放在一个地方,以提高存储和维护的效率。它是一个实现细节。
但是请注意,您没有在应该使用接口的地方使用抽象基类。请参阅接口与基类

于 2008-10-25T10:40:47.047 回答
3

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

于 2008-10-25T11:49:29.347 回答