代码之家  ›  专栏  ›  技术社区  ›  Adam Asham

Java-抽象类包含变量?

  •  32
  • Adam Asham  · 技术社区  · 17 年前

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

    public abstract class ExternalScript extends Script {
    
        String source;
    
        public abstract void setSource(String file);
    
        public abstract String getSource();
    }
    

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

    你有什么建议?

    /亚当

    3 回复  |  直到 17 年前
        1
  •  34
  •   deHaar    7 年前

    我本以为这样会好得多,因为你要添加一个变量,所以为什么不限制访问并使其更清晰呢?你的吸气剂/定型剂应该照他们说的做。

    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
  •  8
  •   Community Mohan Dere    9 年前

    当然。为什么不呢?
    抽象基类只是为了在一个地方容纳2个或多个类共有的行为和数据,以提高存储和维护的效率。这是一个实施细节。
    但是要注意,不要在应该使用接口的地方使用抽象基类。提到 Interface vs Base class

        3
  •  2
  •   Dermot Dermot    17 年前

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

    推荐文章