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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> покритикуйте решение 
:(
    Опции темы
zomber
Дата 30.12.2011, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



нужен внутренний класс
но его функционал надо переопределить в наследнике основного класса

решение:

Код

class C
{
  protected interface Action {
    public void doIt();
  }

  private class ExtendedAction implements Action {
    public void doIt() { System.out.println("1"); };
  }

  Action a;
}

class D extends C
{
  private class ExtendedAction implements Action {
    public void doIt() { System.out.println("2"); };
  }
}


нормально или можно как-то лучше ?


PM MAIL   Вверх
Stolzen
Дата 31.12.2011, 05:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Собственно, написанное равнозначно этому:

Код

class C
{
  protected interface Action {
    public void doIt();
  }
  private class ExtendedAction implements Action {
    public void doIt() { System.out.println("1"); };
  }
  private class ExtendedAction implements Action {
    public void doIt() { System.out.println("2"); };
  }
  Action a;
}


А что и куда вам нужно переопределить? 


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Pawl
Дата 1.1.2012, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 7
Всего: 28



Цитата(Stolzen @  31.12.2011,  05:15 Найти цитируемый пост)
Собственно, написанное равнозначно этому:

не равнозначно. См. внимательно: 2 одинак. названия в одном классе (ExtendedAction) - не скомпилируется!


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Stolzen
Дата 2.1.2012, 04:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Ну по сути это одно и то же, просто за счет области видимости классам можно дать одинаковые имена - но ведь это не является переопределением.  Но, я так понимаю, нужно вовсе не это, а чтобы в классах D при выполнении a.doIt() выводилось "2"?

Это сообщение отредактировал(а) Stolzen - 2.1.2012, 04:58


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
sergioK1
Дата 4.1.2012, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(zomber @ 30.12.2011,  13:39)
нужен внутренний класс
но его функционал надо переопределить в наследнике основного класса

решение:

Код

class C
{
  protected interface Action {
    public void doIt();
  }

  private class ExtendedAction implements Action {
    public void doIt() { System.out.println("1"); };
  }

  Action a;
}

class D extends C
{
  private class ExtendedAction implements Action {
    public void doIt() { System.out.println("2"); };
  }
}


нормально или можно как-то лучше ?

нет не нормально, за такое руки пообламать надо   smile 
PM MAIL   Вверх
Pawl
Дата 4.1.2012, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 7
Всего: 28



Цитата(sergioK1 @  4.1.2012,  16:41 Найти цитируемый пост)
нет не нормально, за такое руки пообламать надо

хоть я и не автор этой темы, но мне до жути интересно, а как же нормально? Просветите, о мудрейший! smile 


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
Stolzen
Дата 6.1.2012, 06:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Если цель - переопределить поведение a.doIt() в подклассе, то лучше всего сделать что-то типа следующего:

Код

iinterface Action {
    void doIt();
}

class A {
    private Action a;

    public A(Action a) {
        this.a = a;
    }

    public void perform() {
        a.doIt();
    }
}

class C extends A {
    public C() {
        super(new Action() {
            public void doIt() {
                System.out.println("1");
            };
        });
    }
}

class D extends A {
    public D() {
        super(new Action() {
            public void doIt() {
                System.out.println("2");
            };
        });
    }
}


Но при таком подходе классы C и D в принципе не нужны. И этот паттерн называется Стратегия.


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
jk1
Дата 6.1.2012, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 40
Всего: 75



Stolzen

Честно говоря, Ваш пример гораздо больше похож на паттерн Command (Action), чем на Strategy


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Stolzen
Дата 6.1.2012, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



jk1, из-за названия интерфейса, может быть, я его просто позаимствовал из оригинального кода. Так-то по цели (так, как я ее понял) это стратегия - изменение поведения класса в зависимости от обстоятельств. 


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

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

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


 




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


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

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