これを行うより良い方法は、protected代わりにスーパークラスのフィールドを作成privateすることです-これにより、サブクラスでそれらにアクセスできるようになります。
サブクラスのコンストラクターを定義した場合、スーパークラスからもコンストラクターを呼び出す必要があることに注意してください。そのため、その点では、必要なすべての変数を引き続き渡すことができます。
また、スーパークラスのすべてのパブリック メソッドは、サブクラスのインスタンスを持つ任意のコードからそのまま呼び出すことができることを忘れないでください。
編集:ちょっとした例が役立つかもしれません:
public class DefaultTableModel
{
protected String modelName;
protected int numberOfTables;
private numTimesReinited = 0;
public DefaultTableModel(String name, int numTabs)
{
modelName = name;
numberOfTables = numTabs;
}
public void reinit()
{
numTimesReinited++;
// Other stuff
}
protected int getNumberOfReinits()
{
return numTimesReinited;
}
public String getName()
{
return name;
}
}
public class MyTableModel extends DefaultTableModel
{
private String modelType;
public MyTableModel(String name, int numTables, String modelType)
{
super(name, numTables); // sets up the fields in the superclass
this.modelType = modelType;
}
// purely "local" code
public void getModelType()
{
return modelType;
}
// Accesses several protected data to provide new (public) functionality
public void addTable()
{
if (getNumberOfReinits() < 10)
{
numberOfTables++;
reinit();
}
}
}
要件を誤解している場合はお知らせください。ただし、スーパークラスのフィールドと動作にアクセスしたいようです。そうでない限り、サブクラスで自動的にアクセスできますprivate。