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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> антиполиморфизм 
:(
    Опции темы
v2v
Дата 13.8.2010, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



как получить "хороший ответ", при том что первые два класса модифивировать нельзя?
Код

class A {
    String a = "good answer";

    String a() {
        return a;
    }
}

class AA extends A {
   boolean isGoodAnswer;
    String a() {
         // isGoodAnswer = false;
        return isGoodAnswer?:super.a():"bad answer";
    }
}

public class AntiPolimorphismTest {
    public static void main(String[] s) {
        A a = new AA();
        System.out.println(a.a());
    }
}


Создавать также необходимо экземпляр класса АА, а не А. Наследовать и перегружать тоже не желательно. Хотелось бы обойтись изменениями только в самом мейне.

Это сообщение отредактировал(а) v2v - 13.8.2010, 17:02


--------------------
PM   Вверх
MisterCleric
Дата 13.8.2010, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

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



Привет. А зачем тогда писать так:
Код

 A a = new AA();




--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
AbdulBcex
Дата 13.8.2010, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



  smile 
Код

public static void main(String[] args) {
    A a = new AA();
    a.a(); //"bad answer"

    A a1 = new A();
    a1.a();//"good answer"
    }


Выбор метода же происходит на этапе работы программы - по типу объекта, который ссылается переменная суперкласса.
Или?

Это сообщение отредактировал(а) AbdulBcex - 13.8.2010, 16:27
PM MAIL   Вверх
Kircul
Дата 13.8.2010, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Может так?
Код

class A {
    void a() {
        System.out.println("good answer");
    }
}

class AA extends A {
    void a() {
        System.out.println("bad answer");
    }
}

class AAA extends AA {
    AAA(AA a) {
        //copy all fields from a to this
    }

    @Override
    void a() {
        System.out.println("good answer");
    }
}

public class AntiPolimorphism {
    public static void main(String[] s) {
        A a = new AAA(new AA());
        a.a();
    }
}

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


Дикий Кот. =^.^=
****
Награды: 1



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

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



MisterCleric, вот-вот. Я тоже что-то не догоняю.

Цитата(v2v @  13.8.2010,  16:58 Найти цитируемый пост)
как получить "хороший ответ", при том что первые два класса модифивировать нельзя?

Написать
Код

A a = new A();


В чём проблема?


--------------------
PM MAIL WWW GTalk Jabber   Вверх
MisterCleric
Дата 13.8.2010, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

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



Цитата

В чём проблема? 


И действительно нет необходимости модифицировать те два класса.


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
AntonSaburov
Дата 13.8.2010, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


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

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



Или надо правильно формулировать вопрос - как вызвать метод родителя вместо текущего оверайденного метода
Ну вот такой вариант. Хотя и похоже на то, что было выше с наследованием

Код


public class Main {

    public static void main(String[] args) {
        TestB b = new TestB() {
            @Override
            public void test() {
                TestA a = new TestA();
                // инициализация полей объекта a от this - через конструктор, clone или еще что
                a.test();
            }
        };

        b.test();
        b.test2();
    }
}

class TestA {

    public void test() {
        System.out.println("test A");
    }

    public void test2() {
        System.out.println("test2 A");
    }
}

class TestB extends TestA {

    @Override
    public void test() {
        System.out.println("test B");
    }

    @Override
    public void test2() {
        System.out.println("test2 B");
    }
}


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


Бывалый
*


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

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



AntonSaburov, в вашем случае после вызова a.test(); все же необходимо вернуть состояние обекта (значения полей, которые могли измениться) объекту b.
PM   Вверх
v2v
Дата 13.8.2010, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



all, исправил условия. Создаётся именно объект класса АА, и повлиять на это я никак не могу.
AntonSaburov, твой вариант также не подходит, почему?, смотри исправленный пример: метод а() класса А  возвращает некую переменную из родительского класса, метод с таким же именем дочернего классу уже возвращает совсем другое.

Добавлено через 1 минуту и 37 секунд
пока что я пришёл к выводу что это не возможно  smile 


--------------------
PM   Вверх
Kircul
Дата 13.8.2010, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



v2v, как-то запотанно вы объясняете, не могли бы вы на данном примере пояснить какой ответ вы хотите получить?
Код

class A {
    String a() {
        return "good " + b();
    }
    
    String b() {
        return "or bad";
    }
}

class AA extends A {

    String b() {
        return "answer";
    }

    String a() {
        return "bad answer";
    }
}

public class AntiPolimorphism {
    public static void main(String[] s) {
        A a = new AA();
        System.out.println(a.a());
    }
}


good answer или good or bad?
PM   Вверх
v2v
Дата 13.8.2010, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Kircul, всё просто, я хочу что бы вызвался метод родительского класса, при условии что такой метод с такой же сигнатурой есть в дочернем.


--------------------
PM   Вверх
AntonSaburov
Дата 13.8.2010, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


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

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



Цитата(Kircul @  13.8.2010,  16:57 Найти цитируемый пост)
AntonSaburov, в вашем случае после вызова a.test(); все же необходимо вернуть состояние обекта (значения полей, которые могли измениться) объекту b. 

Согласен.
PM MAIL WWW ICQ   Вверх
Kircul
Дата 13.8.2010, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Учитывая последнее изменение (добавление поля isGoodAnswer) поставленой задачи, можно сделать так:
Код

class A {
    String a = "good answer";

    String a() {
        return a;
    }
}

class AA extends A {
    private boolean isGoodAnswer; // поправил модификатор, что бы задача была не такой тирвиальной

    String a() {
        // isGoodAnswer = false;
        return isGoodAnswer ? super.a():"bad answer";
    }
}

public class AntiPolimorphism {
    public static void main(String[] s) throws NoSuchFieldException, IllegalAccessException {
        A a = new AA();
        final java.lang.reflect.Field field = AA.class.getDeclaredField("isGoodAnswer");
        field.setAccessible(true);
        field.set(a, true);
        System.out.println(a.a());
    }
}

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


Эксперт
***


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

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



Kircul, изменять состояние класса нельзя.


--------------------
PM   Вверх
AntonSaburov
Дата 13.8.2010, 19:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


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

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



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

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

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


 




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


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

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