Приведение объекта базового класса к производному классу

Я оказываюсь в затруднительном положении. Я строю некоторую логику поверх существующего проекта, предоставленного мне в банке. Следовательно, у меня нет возможности изменять эти классы.

Я хочу написать дополнительные методы для существующего класса, чтобы сделать его многофункциональным. Эти методы будут работать с несколькими данными экземпляра и использовать некоторые из существующих методов экземпляра.

Но поскольку класс нельзя изменить напрямую, я пишу эти дополнительные методы в его новом производном классе. Рассмотрим следующий пример.

public class Parent
{
  public void existing method()
  {

  }
} 


public class Child extends Parent
{
  public void newMethod()
  {

  }
}


public class Other
{
  public Parent foo()
  {
     Parent pr = new Parent();
     return pr;
  }
}

public class Test
{
   Other o = new Other();
   Parent p = o.foo;
   Child c = (Child) p;
   c.newMethod();
}

Когда я запускаю этот код, я получаю ClassCastException. Я осознаю, что опускаю руки. Можно ли привести объект базового класса к объекту производного класса?

Если да, каков будет законный сценарий, в котором можно понизить уровень?

Если нет, то как следует рассматривать вышеуказанный случай? . Стоит ли менять дизайн

Ценим ваши комментарии / предложения !!!


person Chiseled    schedule 25.09.2014    source источник
comment
Когда вы вызываете newMethod(), почему вы не можете вызвать его в производном классе? как новый Child().newMethod()?   -  person Kumar Abhinav    schedule 25.09.2014
comment
Что мешает сразу создать дочерний класс в Test? Ребенок c = новый Ребенок ()?   -  person Utsav Gupta    schedule 25.09.2014
comment
Вы должны создать экземпляр Child в методе foo(). Или это по каким-то причинам невозможно?   -  person Sergiy Medvynskyy    schedule 25.09.2014
comment
@KumarAbhinav, пожалуйста, обратитесь к приведенному выше примеру. Мне нужно вызвать метод foo класса Other, который возвращает объект родительского класса. У newMethod есть операция, которую я хочу выполнить с элементами данных p, принадлежащими родительскому классу.   -  person Chiseled    schedule 25.09.2014
comment
я надеюсь, что это проясняет, почему я не могу напрямую создать экземпляр дочернего класса.   -  person Chiseled    schedule 25.09.2014


Ответы (1)


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

Я бы предложил создать метод «cast» в вашем классе Other, где вы бы взяли все, что имеет значение в дочернем элементе, затем создали родительский объект с этими данными и вернули его.

Что-то вроде этого :

public Parent downcast(Child c)
{
    Parent cast = new Parent();
    //Transfer data from the child to the parent
    cast.setProperty(c.getProperty());
    return cast;
}

Вероятно, есть лучшее решение, чем это, но оно может легко решить вашу проблему.

Обновлять

Это может помочь и вам, может быть, дубликат? : Как понизить Java-объект?

person GPierre    schedule 25.09.2014