powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Переопределенные методы класса
11 сообщений из 11, страница 1 из 1
Переопределенные методы класса
    #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
Переопределенные методы класса
    #38574389
Kandimus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно забыл указать, что проверял на С++.
...
Рейтинг: 0 / 0
Переопределенные методы класса
    #38574400
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kandimus
print(); // Тут почему-то вызывается метод BBB::out

Точнее BBB::print?

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

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

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

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

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

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

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

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

Все, понятно. Значить придется делать много дублирующего кода для предотвращения вызова переопределяемых методов в других методах, это плохо.
Спс.
...
Рейтинг: 0 / 0
Переопределенные методы класса
    #38574448
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KandimusЗначить придется делать много дублирующего кода для предотвращения вызова переопределяемых методов в других методах, это плохо.
Дык, спрашивайте как сделать без "дублирующего кода" - подскажем.
...
Рейтинг: 0 / 0
Переопределенные методы класса
    #38574563
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KandimusЗначить придется делать много дублирующего кода
Сделайте финальные приватные методы и их публичные обертки.
Обертки и переопределяйте. А если надо вызвать не переопределенный метод - вызываете приватный.
...
Рейтинг: 0 / 0
Переопределенные методы класса
    #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
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Переопределенные методы класса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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