2011-02-01 3 views
5

Я пишу абстрактный класс, и у меня есть переменная, которая должна быть определена подклассом (в этом случае это int, который используется в суперклассе). Я не могу решить, следует ли определять переменную protected со значением по умолчанию, и пусть подкласс изменит значение либо в конструкторе, либо через метод setter. Или определить абстрактный метод в родительском классе, так что все подклассы должны реализовать его и вернуть значение, которое они хотят использовать (затем получить доступ к методу в суперклассе с использованием абстрактного метода). Может ли кто-нибудь сказать мне, есть ли какие-то веские причины, почему один из способов должен быть предпочтительнее другого?Должен ли я использовать абстрактный метод или переменную экземпляра для данных, которые должны быть указаны подклассом?

Аннотация Метод:

public abstract int getValue(); 

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

сила подкласс думать об этом значении и выбрать то, что они хотят, чтобы это было.

  • Минусы:

Значение по умолчанию не, так что даже если большинство из подклассов просто хотите использовать то же значение, что они все еще должны реализовать метод. (Этот метод может быть неабстрактный и вернуть значение по умолчанию, но тогда вы потеряете преимущество заставляя подклассы думать о значении)

Protected Variable:

protected int value; 

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

Может определять значение по умолчанию, а подклассы могут просто игнорировать его, если им все равно.

  • Минусы:

Авторы подклассу не осведомлены о существовании переменной, так что они могут быть удивлены поведением по умолчанию.

+1

Является ли значение неизменным? Если нет, кто несет ответственность за изменение стоимости? –

+0

Нет необходимости в неизменном значении, но я не ожидал, что он изменится после создания объекта. – DaveJohnston

+0

Я думаю, что лучше смотреть на это с другой точки зрения. Если нет требования сделать его изменчивым, начните с него, сделав его неизменным. Измените его на mutable, если появится требование. –

ответ

8

Ну, это зависит от ...

  • ли значение должно быть в состоянии изменить в течение всего срока службы объекта? Если нет, вы можете сделать его защищенным параметром конструктора и сделать его конечной частной переменной в вашем базовом классе.

  • Возможно ли, что подклассы могут вычислять переменную на основе другого изменяемого состояния? Если это так, то было бы целесообразно использовать абстрактный геттер.

  • В противном случае я, вероятно, использовал бы закрытую переменную и защищенный сеттер. Я вообще не поклонник не-частных переменных. Это может позволить вам реагировать на изменения значения в базовом классе, например, изменять другие поля компьютера. Чтобы избежать наличия значения по умолчанию, вы могли бы объединить это с параметром конструктора, чтобы принудительно установить начальное значение, которое подкласс может впоследствии изменить через установщик.

+2

+1 для параметра «защищенный конструктор». – Raedwald

+0

Спасибо, защищенный конструктор, вероятно, так, как я хочу. – DaveJohnston

Смежные вопросы