Java: как получить доступ к членам объекта в иерархии классов, где один член меняет свой тип данных - PullRequest
0 голосов
/ 05 августа 2011

У меня есть три класса:

class A
{
  public Object Person;
}

class B extends A
{
}

class C
{
  public String Name;
}

Я хочу получить доступ Имя:

B b = new B();
C c = new C();
c.Name = "John";

b.Person = c;
String s = b.Person.Name; // This is not allowed. Name is not a property of Person.

Как я могу ссылаться на свойство Name (либо для записи в него, либо для чтения из него)?

На самом деле, я мог бы иметь класс D, E, F, который мне нужно назначить b.Person, где каждый класс имеет совершенно разные свойства. Поэтому решение должно работать с классами D, E, F и т. Д.

Ответы [ 6 ]

3 голосов
/ 05 августа 2011

Вам необходимо привести:

String s = ((C)b.Person).Name;

Обратите внимание, что это опасный метод кодирования, поскольку теперь изменение типа данных Person в A может привести к тому, что этот код вызовет исключение во время выполнения.Для вашей модели вам было бы гораздо лучше использовать строгую типизацию (т.е. использовать конкретные классы, а не Object).

2 голосов
/ 05 августа 2011

Вам нужно спроектировать лучшую объектную модель. Использование типа «Объект» слишком абстрактно, как уже указывалось. В какой-то момент ваш код должен иметь дело с «конкретным» типом. Java - это строго типизированный язык программирования. Некоторые другие языки более гибкие и допускают такой тип динамической типизации во время выполнения.

0 голосов
/ 08 августа 2011

Вы можете рассмотреть возможность использования некоторых универсальных :

class A<T>
{
  public T person;
}

class B extends A<Person>
{
}

или / и использовать некоторые интерфейсы.

В любом случае это странная конструкция, вам лучше просто использовать Personкласс, где вы можете установить имя.И в объектно-ориентированном виде используйте некоторый полиморфизм .

Я видел, что вы начали имя переменной с заглавной буквы, поэтому небольшой совет: используйте верблюжий корпус (Я исправил это в моем примере)

0 голосов
/ 05 августа 2011

Если ваши классы bean , вы можете использовать Commons BeanUtils для чтения вложенного свойства:

BeanUtils.getNestedProperty(b, "person.name");

PS: пожалуйста, попробуйте использовать соглашения о кодировании Java:имена членов начинаются со строчной буквы, свойства обычно являются закрытыми и предоставляются методами get / set и и так далее .

0 голосов
/ 05 августа 2011

Вы можете разыграть b, чтобы получить доступ к свойству Name;

String s = ((C)b.Person).Name
0 голосов
/ 05 августа 2011

Вы должны привести человека к C, если хотите получить доступ к C членам (поскольку Person относится к типу Object):

String s = ((C)b.Person).Name;

Два примечания:

  1. Не рекомендуется объявлять элементы как публичные, но как частные и объявлять методы getter / setter для доступа к ним.
  2. Обычно имена элементов начинаются с нижнего регистра, а не с верхнего.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...