Используйте объект подкласса для изменения защищенного свойства в его объекте суперкласса - PullRequest
0 голосов
/ 29 апреля 2010

Извините за дерьмовый заголовок Я не смог придумать более подходящую версию для моего вопроса о Java. Я сейчас использую версию Java: 1.6.0_18 и версию Netbeans: 6.8

Теперь к вопросу.

Что я сделал, так это создал класс только с одним защищенным свойством int, а затем я сделал открытый метод для установки для свойства int заданного значения. Затем я создал объект этого класса и использовал указанный публичный метод, чтобы установить для свойства int значение 5. Теперь мне нужна ваша помощь для создания другого класса, который будет принимать указанный объект и выставлять его защищенное свойство int.

Я мог подумать об этом, чтобы создать подкласс для наследования указанного класса, а затем создать метод для получения свойства int суперкласса. Мне удалось создать код для получения свойства int, но теперь я не могу понять, как использовать этот новый подкласс для ссылки на объект суперкласса.

Вот 2 класса, которые у меня есть:

public class A
{
  protected int iNumber;

  public void setNumber ( int aNumber )
  {
    iNumber = aNumber;
  }
}
public class B extends A
{
  public int getNumber()
  {
   return super.iNumber;
  }
}

Я создал объект 'A' и использовал его метод, чтобы установить его свойство равным 5, например:

A objA = new A();
objA.setNumber ( 5 );

Теперь я хочу создать объект 'B', чтобы вывести int, хранящийся в свойстве objA. Я пытался запустить этот код:

B objB = (B) objA;
String aNumber_String = String.valueOf( objB.getNumber() );
System.out.println( aNumber_String );

но я получил ошибку: "java.lang.ClassCastException" в первой строке

B objB = (B) objA; 

Пожалуйста, в любом случае, делать то, что я пытаюсь сделать?

P.S. Я надеюсь, что эта идея сработает, потому что я не хочу редактировать класс A (если у меня нет выбора), предоставив ему метод получения.

P.P.S Также я знаю, что это «плохая» идея выставлять свойство вместо того, чтобы делать его закрытым и использовать общедоступные методы установки / получения, но мне нравится это так:).

Редактировать: Добавлены теги кода

Ответы [ 3 ]

1 голос
/ 29 апреля 2010

Для линии

B objB = (B) objA;

объект класса A не является объектом класса B, поэтому приведение не будет разрешено.

Классовые отношения между A и B таковы, что B is-a A (потому что класс B расширяется A), но обратное не может быть сказал в этом случае.

Возьмем, к примеру, следующее, если существует следующее:

  • класс Animal.
  • класс Dog расширяется Animal

В приведенном выше примере делается попытка привести Animal к Dog:

Dog dogObject = (Dog)animalObject;  // Not allowed.

Это не может быть обязательно, так как не все Animal с Dog с - насколько нам известно, animalObject может быть экземпляром класса Cat, который расширяет Animal, что это определенно не Dog.

1 голос
/ 29 апреля 2010

Вы не можете привести объект A к B. Если вы хотите вызвать getNumber, у вас должен быть настоящий объект B:

B objB = new B();
objB.setNumber ( 5 );
System.out.println( objB.getNumber() );

Броски не нужны.

0 голосов
/ 29 апреля 2010

Как уже говорили другие, вы не можете наложить объект A на B из-за их отношений. Я хотел бы добавить, что на самом деле звучит так, будто у вас есть только один класс, но у вас есть ситуации, когда вы хотите, чтобы другие объекты не могли прочитать значение числа. Я бы сказал, что лучше использовать интерфейс. Определите интерфейс, чтобы иметь только метод setNumber (int). Определите класс, чтобы иметь методы getNumber () и setNumber (int), и для реализации вашего интерфейса «setter». Затем, где бы у вас ни был метод, который принимает объект A в качестве параметра, измените его так, чтобы он принимал ваш интерфейс.

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

...