Могу ли я сделать защищенного члена общедоступным в Java? Я хочу получить к нему доступ из подкласса - PullRequest
1 голос
/ 04 февраля 2010

Я новичок в Java и ООП,

Я использовал закрытый подкласс (фактически структура) B в классе A, и все шло хорошо, пока я не решил создать родительский класс C для подкласса.Б. Я хочу опубликовать некоторые из защищенных членов класса С.

Например:

public class A {
   private class B extends C {
       public int product;
       public int x;
       public int y;
       public void add() {
             product=x+y;
       }
   }
   B b=new B;
   b.x=1;
   b.y=2;
   b.multiply();
   System.out.println(b.product+"="+b.x+"x"+b.y);

public class C {
   protected int x;
   protected int y;
   public int sum;
   public C(px,py) {
       x=px;
       y=py;
   }
   public void sum() {
       sum=x+y;
   }
}

И я получаю

Неявный супер-конструктор C () не определен для конструктора по умолчанию.Должен определить явный конструктор

Конечно, я мог бы удалить расширения C и вернуться к тому, что у меня было раньше.Или я мог бы сделать геттер / сеттер.Но я думаю, что понятно, что внутренняя структура является приемлемой, и она должна иметь возможность расширять другие классы.

Ответы [ 2 ]

5 голосов
/ 04 февраля 2010

Сообщение компилятора достаточно ясное - в B вы эффективно получили:

public B() {
    super();
}

и это не получается, потому что в Си нет конструктора без параметров для вызова. Либо введите конструктор без параметров, либо предоставьте явный конструктор в B, который вызывает конструктор в C с соответствующими аргументами.

Я не уверен, что было бы неплохо иметь все эти не приватные поля, заметьте, также не рекомендуется, чтобы поля в B скрывали поля в C. Хотите ли вы действительно экземпляр B, чтобы иметь два x поля и два y поля? Вы понимаете, что они будут отдельными полями, не так ли?

Если вы просто хотите эффективно предоставлять публичный доступ, вы можете получить:

public void setX(int x) {
    this.x = x;
}

public int getX() {
    return x;
}

(и то же самое для y) и удалите дополнительные поля из B. Однако вы не можете изменить фактическую доступность полей в C.

0 голосов
/ 04 февраля 2010

Хорошо, я возился со своим собственным кодом и обнаружил, что проблема в том, что мне нужен защищенный конструктор по умолчанию для суперкласса С. Теперь он работает ...

...