Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Взаимодействие классов / 8 сообщений из 8, страница 1 из 1
13.01.2012, 13:42:07
    #37612950
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие классов
Есть допустим 5 классов: A1, A2, A3, A4, A5;
У них всех есть один общий интерфейс. Плюс у каждого может быть (может и не быть) свой отдельный интерфейс.

Хочу сделать класс-обертку (Класс Z) для них.
В конструктор передается (int 1..5).

В зависимости от int создается класс (A1..5).

В дальнейшей работе с классом Z? я хочу видеть:

1 методы класса Z
2 общего интерфейса (классов A1..5)
3 и своих интерфейсов (если такие имеются).

1 и 2 понятно, проблема с 3 пунктом
...
Рейтинг: 0 / 0
13.01.2012, 13:43:53
    #37612954
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие классов
Напишите внятный пример. А то на пальцах A-Z и ответ будет на пальцах - подключить генерики, ли создать насленика Z для специфичных интерфейсов.
...
Рейтинг: 0 / 0
13.01.2012, 14:04:50
    #37613027
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие классов
Общий интерфейс

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
package test;

public interface Common {

  Integer getA();

  void setA();
}



Интерфейс для класса A1

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
package test;

public interface CommonA1 {

  Integer getB();

  void setB();

}



Класс A1

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
package test;

public class A1 implements Common, CommonA1 {

  public A1() {
  }

  @Override
  public Integer getA() {
    return 0;
  }

  @Override
  public void setA() {
  }

  @Override
  public Integer getB() {
    return null;
  }

  @Override
  public void setB() {
  }

}



Класс A2

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
package test;

public class A2 implements Common {

  public A2() {
  }

  @Override
  public Integer getA() {
    return 0;
  }

  @Override
  public void setA() {
  }

}



Класс Z общий

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
package test;

public class Z implements Common {

  Common common;

  public Z(int x) {
    switch (x) {
      case 1:
        common = new A1();
        break;
      case 2:
        common = new A1();
        break;
      default:
        break;
    }
  }

  @Override
  public Integer getA() {
    return common.getA();
  }

  @Override
  public void setA() {
    common.setA();
  }

}



Теперь создаю класс Z передаю 1 и 2. Вызывая getA() или setA() будут вызывать в зависимости от параметра метода класса A1 или A2. Это все работает отлично. Но у класса A1 есть еще методы getB() или setB().


Вот я и хочу, когда создаю класс Z и передаю парметр были следующие методы видны:
Когда передаю 1, чтоб видел методы getA(), setA(), getB() и setB().
Когда передаю 2, чтоб только методы getA() или setA().
...
Рейтинг: 0 / 0
13.01.2012, 14:15:47
    #37613059
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие классов
-=Koba=-Вот я и хочу, когда создаю класс Z и передаю парметр были следующие методы видны:
Когда передаю 1, чтоб видел методы getA(), setA(), getB() и setB().
Когда передаю 2, чтоб только методы getA() или setA().
Прикастить к нужному интерфейсу и будут "видны".
Вопрос в том как именно вы их будете использовать? В методе getA должен вызывается getA или getB? Вариантов реализации масса. Проблема в том что любой предложеный вы с легкостью отметете, потому что у вас "другой случай". Поэтому нельзя ли более конкретно классы описать и их назначение

Простейший вариант
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 
...
 A1 delegate;
 Common c;
...
delegate = new A1();
...
case 1:
 common = delegate;    
case 2:
 common = new Common(){
   Integer getA() {return delegate.getB();}
 
    void setA() {delegate.setB()}
};
        break;



В реальной жизни наверняка можно сделать проще. Знать бы только вашу модель.
...
Рейтинг: 0 / 0
13.01.2012, 14:25:53
    #37613083
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие классов
Blazkowicz-=Koba=-Вот я и хочу, когда создаю класс Z и передаю парметр были следующие методы видны:
Когда передаю 1, чтоб видел методы getA(), setA(), getB() и setB().
Когда передаю 2, чтоб только методы getA() или setA().
Прикастить к нужному интерфейсу и будут "видны".
Вопрос в том как именно вы их будете использовать? В методе getA должен вызывается getA или getB? Вариантов реализации масса. Проблема в том что любой предложеный вы с легкостью отметете, потому что у вас "другой случай". Поэтому нельзя ли более конкретно классы описать и их назначение


Не если параметр 1

то это класс А1
и следовательно для Z.getA() выйдет A1.getA(), а для Z.getB() выйдет A1.getB();

для класса ж A2

только getA()
...
Рейтинг: 0 / 0
13.01.2012, 14:29:47
    #37613097
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие классов
А как именно планируетяс использовать CommonA1 тогда? А примере он вводится, но не используется.
Покажите, код, который должен его использовать, но не может, потомучто имеет только Common.
Из этого будет видно как лучше. Просто генериками, или ещё от Z наследоватся.
...
Рейтинг: 0 / 0
13.01.2012, 15:44:06
    #37613318
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие классов
BlazkowiczА как именно планируетяс использовать CommonA1 тогда? А примере он вводится, но не используется.
Покажите, код, который должен его использовать, но не может, потомучто имеет только Common.
Из этого будет видно как лучше. Просто генериками, или ещё от Z наследоватся.

Образно говоря Класс Z у меня представлен сейчас так

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
package test;

public class Z implements Common, CommonA1 {

  Common common;

  public Z(int x) {
    switch (x) {
      case 1:
        common = new A1();
        break;
      case 2:
        common = new A1();
        break;
      default:
        break;
    }
  }

  @Override
  public Integer getA() {
    return common.getA();
  }

  @Override
  public void setA() {
    common.setA();
  }

  @Override
  public Integer getB() {
    Integer z = 0;
    if (param == 1) {
      z = ((CommonA1) common).getB();
    }
    return z;
  }

  @Override
  public void setB() {
    if (param == 1) {
      z = ((CommonA1) common).setB();
    }
  }

}



Param - это число заходящее в конструкторе.
Для A1, A2 методы все видны. Только в A1 используются все, а в A2 первые два. Вот и хочу чтоб последние два не были видны

Как-то так
...
Рейтинг: 0 / 0
13.01.2012, 15:52:59
    #37613345
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие классов
-=Koba=-Образно говоря Класс Z у меня представлен сейчас так

Прям в коде напишите что именно должно быть по-другому

-=Koba=-Param - это число заходящее в конструкторе.
Для A1, A2 методы все видны. Только в A1 используются все, а в A2 первые два. Вот и хочу чтоб последние два не были видны
Как-то так
Кому не видны? Почему сделано именно так а не иначе? Какая роль у класса Z? Просто делегирует вызовы? Почему A1 не расширяет A2?

Без предметной области найти решение сложно. Потому что вариантов масса.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Взаимодействие классов / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]