Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Две ситуации на знание ООП


Автор: Entry_N3 30.6.2007, 16:16
Исходная ситуация 1: 
Есть класс A, в одном из public-методов которого используется объект класса Б, точнее ссылка типа интерфейса, который реализует класс Б. Класс Б имеет 2 protected-конструктора.
Мне нужно переопределить у класса Б один public-метод. Для этого я создаю класс ББ, унаследовав от класса Б и переопределяю нужный метод.

Нужно в public-методе класса А подсунуть вместо объекта Б, свой объект ББ. При этом понятно, что просто присвоить нельзя ББ бб = (ББ) б, т.к. это ClassCastException.

Вопрос: Можно ли создать объект ББ, идентичный по состоянию объекту Б? Если да, то как скопировать состояние Б? Вообще, разумно так действовать?

Исходная ситуация 2: 
Есть jarник, отвечающий за определенную логику. Из javadoc-ов я узнаю, что в нем есть класс, метод которого я хочу переопределить. Я наследуюсь, переопределяюсь. 

Вопрос: Какие есть способы заставить использовать объект наследника?

Автор: powerOn 30.6.2007, 17:07
Цитата(Entry_N3 @  30.6.2007,  17:16 Найти цитируемый пост)
Нужно в public-методе класса А подсунуть вместо объекта Б, свой объект ББ. При этом понятно, что просто присвоить нельзя ББ бб = (ББ) б, т.к. это ClassCastException.


Может быть тогда вместо наследования использовать делегирование? Пусть класс ББ (также релизующий общий с Б интерфейс) агрегирует класс Б и делегирует ему все операции общего интерфейса, а так же, дополняет своими собственными операциями. Класс ББ будет иметь метоты Б getБ() и void setБ(Б б); Что позволит в любой момент обернуть Б в ББ.


Цитата(Entry_N3 @  30.6.2007,  17:16 Найти цитируемый пост)
Исходная ситуация 2: 
Есть jarник, отвечающий за определенную логику. Из javadoc-ов я узнаю, что в нем есть класс, метод которого я хочу переопределить. Я наследуюсь, переопределяюсь. 

Вопрос: Какие есть способы заставить использовать объект наследника?

лично я не понял вопроса.

Автор: LSD 30.6.2007, 17:37
Цитата(Entry_N3 @  30.6.2007,  17:16 Найти цитируемый пост)
Нужно в public-методе класса А подсунуть вместо объекта Б, свой объект ББ. При этом понятно, что просто присвоить нельзя ББ бб = (ББ) б, т.к. это ClassCastException.

Не понял вопрос, приваивание Б б = бб; сработает нормально. В чем трудность?

Второй вопрос тоже не понял. Может привести примеры кода: что есть и что требуется сделать.

Автор: Entry_N3 30.6.2007, 19:41
Цитата(LSD @ 30.6.2007,  17:37)
Не понял вопрос, приваивание Б б = бб; сработает нормально. В чем трудность?

Есть объект б, мне нужно подсунуть объект бб, который порожден от наследника класс Б. Трудность - как создать объект бб так, чтобы он копировал состояние объект б? (Все это для того, чтобы метод переопределить)

Автор: Entry_N3 30.6.2007, 19:56
Цитата(powerOn @ 30.6.2007,  17:07)
Может быть тогда вместо наследования использовать делегирование? Пусть класс ББ (также релизующий общий с Б интерфейс) агрегирует класс Б и делегирует ему все операции общего интерфейса, а так же, дополняет своими собственными операциями. Класс ББ будет иметь метоты Б getБ() и void setБ(Б б); Что позволит в любой момент обернуть Б в ББ.

 smile 

Например, так:

Код

interface IBase {
   void foo1();
 
   void foo2();

   /* ... */
}

class B implements IBase {
   public void foo1() {
      /* ... */
   }
 
   public void foo2() {
       /* ... */
   }

   /* ... */
}

class BB implements IBase {
  private IBase m_IBase;
   
   public BB(IBase baseObject) {
     m_IBase = baseObject;
   }

   public void foo1() { 
      m_IBase.foo1(); 
   }

   // переопределенный IBase.foo2()
   public void foo2() {
      /* что-то другое */
   }
}



Тогда в public-методе класса А:
Код

Base b = new Base();

/* ...  */

BB bb = new BB(b);

// Реализация "базового" класса
bb.foo1();

// Своя реализация
bb.foo2();


Это паттерн Wrapper?

Автор: powerOn 30.6.2007, 21:07
Цитата(Entry_N3 @  30.6.2007,  20:56 Найти цитируемый пост)
Например, так:

угу, похоже.

Цитата(Entry_N3 @  30.6.2007,  20:56 Найти цитируемый пост)
Это паттерн Wrapper? 

скорее декоратор.

Автор: Entry_N3 1.7.2007, 09:19
Цитата(LSD @ 30.6.2007,  17:37)
Второй вопрос тоже не понял. Может привести примеры кода: что есть и что требуется сделать.

Уточняю немного наивный второй вопрос. Есть приложение, которое использует на jar-библиотеке. Исходников нет. Переопределяем реализацию опр. метода. опр. класса из этого jarника. Размещаем jarник в WEB-INF\lib, класс-наследник в WEB-INF\classes. Может ли контейнер "увидеть", что есть класс-наследник, и "автоматически" использовать его, вместо родителя (без прописывания соответствующих дескрипторов)?  smile 

В ООП есть что-то подобное?

Автор: LSD 1.7.2007, 09:28
Насчет второго вопроса: честных - никаких.
Обходной использовать рефлексию и присвоить полю класса своего наследника вместо оригинала.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)