Наследование Java-класса: можно ли сделать статический член в родительском классе статическим в сыне? - PullRequest
0 голосов
/ 17 февраля 2011

Прежде чем вы начнете читать, я хотел бы уточнить:

Я уже думал о других проектах и ​​способах обхода Меня интересует только проблема, которую я раскрыл, а не «ее изменение» (поэтому нет таких решений, как удаление точек в A и создание новых полей точек в B и C ...


рассмотрим следующий код:

public class A {
    protected cpVect[][] points = null;
    ...
}

и его классы, которые его наследуют:

    public class B extends A{

            ...
    }

    public class C extends A{

            ...
    }

пока все хорошо.

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

if(points == null){calculate points code}

проблема заключается в следующем

точек в A не могут быть статичными, потому что размеры B и C различны.

но каждый экземпляр B будет делить баллы B, а каждый экземпляр C будет делить баллы C. (другими словами, квадрат всегда будет квадратом, а треугольник всегда будет треугольником). и поэтому я хочу, чтобы B: points и C: points были статическими, чтобы я не получал дубликаты значений для каждого экземпляра.

Так есть ли способ переопределить точки как статические в B и C, когда они не являются статичными в A?

Ответы [ 3 ]

0 голосов
/ 17 февраля 2011

Вы не можете сделать поле статичным, но вы можете сделать его одиночным. У вас будет несколько ссылок на синглтон, но вам понадобится только одна копия каждого массива точек. Например, в B:

  class B extends A {
      private cpVect[][] B_points = null;

      public B() {
          if (B_points == null)
              B_points = create_B_points();
          points = B_points;
      }
  }

Если многопоточный, вам нужно добавить синхронизацию.

(Извините за более раннюю половинную версию. Редактор SO кажется странным в Chrome).

0 голосов
/ 17 февраля 2011

Если вы получаете доступ к points исключительно через методы свойств (методы получения / установки), вы можете делать все, что хотите в подклассах.Если вы используете наследование, A должен быть абстрактным классом.В противном случае вы бы всегда носили переменную пустых точек в A (вероятно, теряя 8 байт).

В этом случае иерархия будет выглядеть так:то же самое для C.Если A не включает никакое другое состояние или функциональность, вы должны сделать его interface.

0 голосов
/ 17 февраля 2011

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

class test {

 public int a;

}

class test1 extends test {
    public static int a;

}

И через объекты вы можете получить доступ к тесту.

через класс test1 вы можете получить доступ к статическому a теста1поскольку оба они независимы.

Нельзя иметь одинаковую переменную в качестве члена в родительском и статическом в дочернем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...