Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Multiple inheritance, "Серия моих тупых вопросов" 
:(
    Опции темы
neutrino
Дата 27.6.2005, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Приветствую!

Вот пример: есть три способности: firstability, secondability and thirdability. Нужно запрограммировать несколько классов с различным набором этих способностей. Среди способностей нет никаких конфликтов (с т.з. программирования). Самый простой и понятный способ запрограммировать эти классы - создать 3 класса: firstable, secondable и thirdable. После чего наследовать все остальные (искомые) классы от комбинации этих трех.

Но, видимо, в языке Java there is no multiple inheritance. Как такая и эквивалентные этой задаче решаются на языке Java? Обратите внимание, что способностей может быть гораздо больше трех.

Премного благодарен.

Сув. neutrino.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
AntonSaburov
Дата 27.6.2005, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Это решается через интерфейсы - интерфейсов может быть наследовано сколько угодно.

Внутри этого сложного класса создаешь три объекта и внутри интерфейсного методы вызываешь метод уже нужного объекта.
PM MAIL WWW ICQ   Вверх
djGri
Дата 27.6.2005, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 21.2.2005

Репутация: 1
Всего: 3




Цитата
Это решается через интерфейсы - интерфейсов может быть наследовано сколько угодно.


Можно, но обрати внимание:
Цитата
способностей может быть гораздо больше трех




Если хочешь сделать это грамотно, то пользуйся паттерном.
Для твоего случая нужен Decorator

Это сообщение отредактировал(а) djGri - 27.6.2005, 20:31
PM MAIL   Вверх
Domestic Cat
Дата 27.6.2005, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Цитата(djGri @ 27.6.2005, 11:27)

Для твоего случая нужен Decorator

Зачем, если не секрет?


--------------------

PM   Вверх
djGri
Дата 27.6.2005, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 21.2.2005

Репутация: 1
Всего: 3



Цитата(Domestic @ 27.6.2005, 19:31)
Зачем, если не секрет?

Это классический случай для Decorator'a
PM MAIL   Вверх
Domestic Cat
Дата 27.6.2005, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Применять или не применять паттерн для решения задачи зависит от условия здачи прежде всего. Если идет речь о способностях и о том, чтобы наделить ими некие классы, самым естественным решением будет создать несколько интерфейсов и унаследовать от них. Тем самым мы выигрываем полиморфизм. Недаром на интерфейсах держится вся Java - возьмем JButton : она наследует от Accessible, ImageObserver, ItemSelectable, MenuContainer, Serializable, SwingConstants - любой баттон будет обладать соответствующими свойствами.
Декоратор же нужен для наделения некими свойствами отдельных объектов, а не всего класса.




--------------------

PM   Вверх
djGri
Дата 27.6.2005, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 21.2.2005

Репутация: 1
Всего: 3



Цитата(neutrino @ 27.6.2005, 16:40)
Нужно запрограммировать несколько классов с различным набором этих способностей.


PM MAIL   Вверх
Domestic Cat
Дата 27.6.2005, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Так классов же. Т.е. все объекты класса будут обладать этими способностями.


--------------------

PM   Вверх
djGri
Дата 27.6.2005, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 21.2.2005

Репутация: 1
Всего: 3



Цитата(Domestic @ 27.6.2005, 20:16)
Так классов же.

Да, ты прав smile
Но это когда не думают о паттернах



PM MAIL   Вверх
neutrino
Дата 28.6.2005, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Спасибо всем за ответы.

Однако, если использовать интерфейсы, то их реализацию придется осуществлять в каждом классе? Т.е. по сути интерфейс - абстрактный класс. Если мне потребуется сделать, например, FirstableAndSecondableClass и SecondableAndThirdableClass; допустим интерфейсы у меня есть, тогда:

Код

class FirstableAndSecondableClass inherits BasicClass implements Firstable, Secondable 
{
...
  // Реализация интерфейса Firstable
...
  // Реализация интерфейса Secondable 
...
}

class SecondableAndThirdableClass inherits BasicClass implements Secondable, Thirdable
{
...
  // Реализация интерфейса Secondable
...
  // Реализация интерфейса Thirdable
...
}


Но в таком случае я реализовываю интерфейс Secondable два раза. В моей задаче мне может потребоваться реализация одного и того же интерфейса 10 раз. Реализация каждого интерфейса в любом классе одинаковая.


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
djGri
Дата 28.6.2005, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 21.2.2005

Репутация: 1
Всего: 3



Почитай про Decorator
PM MAIL   Вверх
AntonSaburov
Дата 28.6.2005, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Зачем два раза.
Есть у тебя интерфейсы A и B

Код

interface A
{
   void showA();
}

interface B
{
   void showB();
}


Например у тебя уже есть реализация интерфейса A и B в виде классов ClassA и ClassB. Дальше делаем так:

Код

public class AB implements A, B
{
   private ClassA a = new ClassA();    // Этот член умеет уже все для интерфейса A
   private ClassB b = new ClassB();    // Этот член умеет уже все для интерфейса B

   public void showA()
   {
      a.showA();
   } 

   public void showB()
   {
      b.showA();
   } 
}


Т.е. надо сделать только обертки. Кстати такие обертки можно сделать с помощью IDE - надо только внутрь вызовы поставить для объектов. Работы на 5 минут.
PM MAIL WWW ICQ   Вверх
neutrino
Дата 29.6.2005, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



AntonSaburov, такое решение не есть удобное, т.к. в реализации способностей (интерфейсов) должны изменяться некоторые параметры самого класса (в твоем случае - АВ).


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
AntonSaburov
Дата 29.6.2005, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 51
Всего: 118



Цитата(neutrino @ 29.6.2005, 10:22)
такое решение не есть удобное, т.к. в реализации способностей (интерфейсов) должны изменяться некоторые параметры самого класса (в твоем случае - АВ).

Ну тут уже кому как и что надо. Просто если есть класс, который уже все что надо умеет - пользуем его. Если же надо что-то еще добавить, то добавляем. Я же не полную реализацию показывал, а идею.
Если же говорить о множественном наследовании, то он существует только в С++. В остальных языках делают все через интерфейсы.
PM MAIL WWW ICQ   Вверх
neutrino
Дата 30.6.2005, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



AntonSaburov Спасибо!


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1695 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.