【问题标题】:Java - Abstract class to contain variables?Java - 包含变量的抽象类?
【发布时间】:2010-09-19 04:04:44
【问题描述】:

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

public abstract class ExternalScript extends Script {

    String source;

    public abstract void setSource(String file);

    public abstract String getSource();
}

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

你有什么建议?

/亚当

【问题讨论】:

    标签: java class variables abstract


    【解决方案1】:

    我原以为这样会更好,因为您要添加一个变量,那么为什么不限制访问并使其更清洁呢?你的 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 方法没有获取和设置,则将它们描述为其他内容。

    始终考虑你的课程是否真的是不同的东西,这应该有助于决定你是否需要更多。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-23
          • 1970-01-01
          • 1970-01-01
          • 2014-09-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多