LINUX.ORG.RU

java


0

0

есть такое наследование классов
A->B->C

везде есть метод onCommit

как из С вызвать версию onCommit из А


Ответ на: комментарий от mono

на java в B был метод onCommit он вызывал super.onCommit я его переписал в С хочу вызвать onCommit от А который вызывался в B

sanets
() автор топика
Ответ на: комментарий от sanets

ниче не понял :-/

вот примерно так:

#include <iostream>

using namespace std;

class A
{
	public: void run()
	{
		cout << "hello A" << endl;
	}
};

class B : public A
{
	public: void run()
	{
		A::run();
		cout << "hello B" << endl;
	}
};

class C : public B
{
	public: void run()
	{
		A::run();
		B::run();
		cout << "hello C" << endl;
	}
};

int main()
{
	C c;
	c.run();
	return 0;
}

mono ★★★★★
()
Ответ на: комментарий от sanets

>на java в B был метод onCommit он вызывал super.onCommit я его переписал в С хочу вызвать onCommit от А который вызывался в B

Ошибка проектирования детектед

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

нельзя такое?
был класс А без исходников
его кто-то отнаследовал создал B переопределил onCommit(вызвал старый)

У меня класс С от В я хочу поменять onCommit в нем.

Где ошибка?

sanets
() автор топика

теоретически можно попробовать через рефлексию:
Method onCommit = getClass().getSuperClass().getMethod( "onCommit", ... )

onCommit.invoke( this, ... );

Crocodille
()

В джаве вроде бы никак такое не сделать, afaik.

smh ★★★
()

вообще такое можно на scala какой-нить, но... напиши в ru_java, даже интересно стало.

Rastafarra ★★★★
()
Ответ на: комментарий от yyk

класс В доступен просто другие его используют

можно конечно добавить в него метод и вызвать из него супер...

думал может можно как-то просто

sanets
() автор топика
Ответ на: комментарий от yyk

>>У меня класс С от В я хочу поменять onCommit в нем.

>А класс B хакнуть можешь?

Если есть доступ к классу B, то это пожалуй грязный, но выход =)

yoghurt ★★★★★
()

А метод случайно не статический ? :-)

ef37 ★★
()
Ответ на: комментарий от sanets

>думал может можно как-то просто

Попробовал хакнуть байткод - не работает

Так что проще - никак

yyk ★★★★★
()
Ответ на: комментарий от sanets

>класс В доступен просто другие его используют

А в чём проблема? Делаешь MyB, в котором оверрайдишь единственный метод onCommit, и от него наследуешь C. Единственный в данном случае правильный вариант, ИМХО. Какие-то хаки через те же рефлекшнс может быть и возможны, но очень уж черезжопные.

shuthdar ★★★
()
Ответ на: комментарий от shuthdar

А не, сорри, вызова onCommit из А в таком случае всё равно не выйдет, надо чтобы класс был extends A. Добавляй новый метод в Б, или копипасть код с введением интерфейса для совместимости двух вариантов Б.

shuthdar ★★★
()
Ответ на: комментарий от shuthdar

Миксины решают данную проблему весьма просто.

iZEN ★★★★★
()

интерфейсы гуглили? тактика с++ здесь не прокатывает.

stave ★★★★★
()

>как из С вызвать версию onCommit из А

В муках рождается программист

Karapuz ★★★★★
()

Самое главное, это понять тут замысел автора, зачем титану мысли вызывать onCommit класса A?

Karapuz ★★★★★
()
Ответ на: комментарий от Karapuz

Чего тут непонятного? У чувака есть класс1 в двоичном виде и код, реализующи класс2. Чувак хочет класс2, но с частичной регрессией. Вместо того, чтобы отрефакторить код, он пытается минимизировать свой вклад в кодовую базу.

LamerOk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.