Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Переопределенные методы класса / 11 сообщений из 11, страница 1 из 1
27.02.2014, 16:03
    #38574387
Kandimus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределенные методы класса
В общем ситуация такая - имеем два класса, один унаследован от другого. Класс-потомок вызывает в своих методах методы супер-класса. В одном из методов, супер-класс вызывает другой метод, который также переопределен в классе-потомке. И вот тут то и начинается чехарда - супер-класс вызывает не свой метод, а метод класса-потомка .

Пример
Код: 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.
class AAA
{
	public void print()
	{
		System.out.println("AAA:print");
	}
	
	public void out()
	{
		System.out.println("AAA:out");
		
		print(); // Тут почему-то вызывается метод BBB::out
	}
};

class BBB extends AAA
{
	@Override
	public void print()
	{
		super.print();
		
		System.out.println("BBB:print");
	}
	
	@Override
	public void out()
	{
		super.out();
		
		System.out.println("BBB:out");
		
		print();
	}
};

...
BBB b = new BBB();
b.out();



Результат работы b.out():
AAA::out
AAA::print
BBB::print <---- вот эта срока меня повергает в шок. ее вообще не должно быть.
BBB::out
AAA::print
BBB::print

Проверил данный код - работает как нужно, т.е. в AAA::out вызывается именно AAA::print.


Теперь собственно вопрос - можно ли как-то добиться того, чтобы супер-класс не вызывал методы потомка?
...
Рейтинг: 0 / 0
27.02.2014, 16:05
    #38574389
Kandimus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределенные методы класса
Собственно забыл указать, что проверял на С++.
...
Рейтинг: 0 / 0
27.02.2014, 16:10
    #38574400
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределенные методы класса
Kandimus
print(); // Тут почему-то вызывается метод BBB::out

Точнее BBB::print?

Kandimus
BBB::print <---- вот эта срока меня повергает в шок. ее вообще не должно быть.

Почему не должно?

KandimusТеперь собственно вопрос - можно ли как-то добиться того, чтобы супер-класс не вызывал методы потомка?
объявить методы родителя как final или private.
Ну, и уделить немного времени самообразованию и таки почитать про виртуальные методы.
...
Рейтинг: 0 / 0
27.02.2014, 16:10
    #38574401
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределенные методы класса
KandimusСобственно забыл указать, что проверял на С++.
Гениальный ход.
...
Рейтинг: 0 / 0
27.02.2014, 16:13
    #38574409
Kandimus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределенные методы класса
Мне как старому Сишнику не понятно, почему супер-класс вызывает метод класса-потомка, о котором он, кстати, нечего не должен знать. В С++ этот код работает нормально, и строки "ВВВ::print" нет (как и положено)

авторТочнее BBB::print?

Да, конечно. Очепятка.
...
Рейтинг: 0 / 0
27.02.2014, 16:14
    #38574411
Kandimus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределенные методы класса
Blazkowiczобъявить методы родителя как final или private.

Если бы мне это было бы нужно, то я бы так и сделал. Но мне нужно поведение вызовов методов как в С++
...
Рейтинг: 0 / 0
27.02.2014, 16:23
    #38574424
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределенные методы класса
KandimusМне как старому Сишнику не понятно, почему супер-класс вызывает метод класса-потомка, о котором он, кстати, нечего не должен знать. В С++ этот код работает нормально, и строки "ВВВ::print" нет (как и положено)

В Java все не приватные, не статические и не финальные методы являются виртуальными .
В отличие от C++, указывать конкретному методу является ли он виртуальным или нет - нельзя.
...
Рейтинг: 0 / 0
27.02.2014, 16:27
    #38574432
Kandimus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределенные методы класса
BlazkowiczKandimusМне как старому Сишнику не понятно, почему супер-класс вызывает метод класса-потомка, о котором он, кстати, нечего не должен знать. В С++ этот код работает нормально, и строки "ВВВ::print" нет (как и положено)

В Java все не приватные, не статические и не финальные методы являются виртуальными .
В отличие от C++, указывать конкретному методу является ли он виртуальным или нет - нельзя.

Все, понятно. Значить придется делать много дублирующего кода для предотвращения вызова переопределяемых методов в других методах, это плохо.
Спс.
...
Рейтинг: 0 / 0
27.02.2014, 16:37
    #38574448
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределенные методы класса
KandimusЗначить придется делать много дублирующего кода для предотвращения вызова переопределяемых методов в других методах, это плохо.
Дык, спрашивайте как сделать без "дублирующего кода" - подскажем.
...
Рейтинг: 0 / 0
27.02.2014, 18:00
    #38574563
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределенные методы класса
KandimusЗначить придется делать много дублирующего кода
Сделайте финальные приватные методы и их публичные обертки.
Обертки и переопределяйте. А если надо вызвать не переопределенный метод - вызываете приватный.
...
Рейтинг: 0 / 0
27.02.2014, 22:18
    #38574786
Kandimus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переопределенные методы класса
Сергей АрсеньевKandimusЗначить придется делать много дублирующего кода
Сделайте финальные приватные методы и их публичные обертки.
Обертки и переопределяйте. А если надо вызвать не переопределенный метод - вызываете приватный.
Да, спс. Пока ехал до дома пришел к такому же выводу.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
class AAA
{
	private void _print()  // Обертка для предотвращения "виртуализации" функции
	{
		System.out.println("AAA:print");
	}
	
	public void print()
	{
		_print();
	}
	
	public void out()
	{
		System.out.println("AAA:out");
		
		_print();
	}
};
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Переопределенные методы класса / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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