2011-02-01 53 views
5

我正在写一个抽象类,我有一个应该由子类定义的变量(在这种情况下,它是一个在超类中使用的int)。我无法决定是否使用默认值来定义protected变量,并让子类在构造函数中或通过setter方法更改该值。或者在父类中定义一个抽象方法,以便所有子类必须实现它并返回它们想要使用的值(然后使用抽象方法访问超级类中的方法)。任何人都可以告诉我,为什么一种方式比另一种更受欢迎?对于应该由子类指定的数据,我应该使用抽象方法还是实例变量?

抽象方法:

public abstract int getValue(); 

public int getValue() { 
    return 5; 
} 
  • 优点:

军队子类来思考这个值,并选择他们希望它是什么。

  • 缺点:

没有缺省值,所以即使多数子类只是想用相同的值仍然要实现该方法。 (该方法可以由非抽象并返回默认值,但你失去迫使子类来思考价值的优势)

受保护的变量:

protected int value; 

public SubClassImpl() { 
    value = 5; 
} 
  • 优点:

可以定义一个默认值,子类可以忽略它,如果他们不在乎。

  • 缺点:子类的

作者没有意识到的变量的存在,所以他们可能会被默认的行为感到惊讶。

+1

值是不可变的吗?如果不是,谁负责改变价值? – 2011-02-01 14:53:55

+0

没有要求该值是不可变的,但我不希望它在创建对象后被更改。 – DaveJohnston 2011-02-01 15:10:45

回答

8

嗯,这取决于...

  • 是否值必须能够对象的生命周期中的变化?如果不是的话,你可能希望使它成为受保护的构造函数参数,并使其成为基类中的最终私有变量。

  • 可能子类有理由计算基于其他可变状态的变量吗?如果是这样,抽象的getter将是适当的。

  • 否则,我可能会使用一个私有变量和受保护的setter。我通常不是非私有变量的粉丝。这可以允许您对基类中的值进行更改,例如更改其他计算机字段。为了避免出现默认值,你可以将它和一个构造函数参数结合起来,强制一个初始值,这个初始值可以通过setter在以后改变。