2016-03-11 8 views
0

У меня есть абстрактный класс с полем в нем, которые должны иметь следующие свойства:Как установить поля в абстрактном классе?

  • чтения для открытого интерфейса
  • WriteOnly для подклассов

теперь мой вопрос: каким образом Я установил и инициализировал это поле?

public abstract class A { 
    // initialize it here ? 
    private int field = 0; 

    // initialize it in constructor ? 
    protected A(int field) 
    { 
     this.field = field; 
    } 

    // use protected setter ? 
    protected void setField(int val){ 
     this.field = val; 
    } 

    // or use protected field 
    protected int field; 

    public int getField(){ 
     return field; 
    } 
} 

Как инициализировать/получить доступ к этим полям?

public class B extends A { 

    public B(int val){ 
     super(val); 
     // or 
     setField(val); 
     // or 
     field = val; 
    } 
} 

, и это хорошая идея использовать smth. как защищенный конструктор?

+0

зачем мне нужны статические переменные? – jam

+0

@KevinEsche Я думаю, что он имеет в виду статические данные, а не статическую переменную – Pragnani

+1

@jam, потому что название говорит так? – f1sh

ответ

1

Это в основном от ваших потребностей

Если вы хотите инициализировать супер поле класса при создании дочернего объекта это сам, то вы могли бы назвать super(val);

Если вы хотите создать дочерний объект, независимый от родителей значения полей объекта. используйте конструктор по умолчанию для дочернего класса и, если требуется установить родительское значение, вызовите метод setField(val); для дочернего объекта.

это хорошая идея использовать smth. как защищенный конструктор?

Да, если вы действительно хотите, чтобы ограничить доступ для классов в рамках пакета

+0

так защищенные конструкторы для абстрактных классов, используются таким образом . Это может быть недостатком дизайна – jam

+0

, а как насчет использования защищенного поля вместо сеттера? – jam

+0

@jam Не рекомендуется открывать поля непосредственно даже для подклассов, всегда можно обеспечить доступ через Setters и Getters. Поэтому поле, защищенное ИМО, не является хорошей идеей. – Pragnani