Есть приблизительно такой код
public class A
{
...
public virtual void x ()
{
...
}
...
}
public class B: A
{
...
public override void x ()
{
...
base.x();
...
}
...
}
public class C: B
{
...
public override void x ()
{
/*полная копия кода ф-ции класа B*/
...
base.x();
...
}
...
}
Как мне из класа С вызвать ф-цию х класа А? При этом ф-ция класа B вызываться не должна.
По логике в подсвечной (полужирной) строке должно быть что-то типа base.base.x();
Здравствуйте, Mr. Woland, Вы писали:
В C# это невозможно сделать. В то же время, .NET позволяет.
Если метод x класса C написать таким:
public override void x() {
...
((A)this).x();
}
то на рантайме получаем StackOverflow exception.
В il'е это выглядит:
.method public hidebysig virtual instance void
y() cil managed
{
// Code size 17 (0x11)
.maxstack 1
IL_0000: ldarg.0
IL_0001: callvirt instance void ClassesTest.A::x()
IL_0006: ret
} // end of method C::x
Если теперь подправить в il'е код на:
.method public hidebysig virtual instance void
y() cil managed
{
// Code size 17 (0x11)
.maxstack 1
IL_0000: ldarg.0
IL_0001: call instance void ClassesTest.A::x()
IL_0006: ret
} // end of method C::x
и сделать с этого новый exe, будет работать.
Но нужен ли такой гемморой?
MW>Есть приблизительно такой код
MW>MW>public class A
MW>{
MW> ...
MW> public virtual void x ()
MW> {
MW> ...
MW> }
MW> ...
MW>}
MW>public class B: A
MW>{
MW> ...
MW> public override void x ()
MW> {
MW> ...
MW> base.x();
MW> ...
MW> }
MW> ...
MW>}
MW>public class C: B
MW>{
MW> ...
MW> public override void x ()
MW> {
MW> /*полная копия кода ф-ции класа B*/
MW> ...
MW> base.x();
MW> ...
MW> }
MW> ...
MW>}
MW>
MW>Как мне из класа С вызвать ф-цию х класа А? При этом ф-ция класа B вызываться не должна.
MW>По логике в подсвечной (полужирной) строке должно быть что-то типа base.base.x();
Я бы вообще вынес в отдельный метод те действия, которые должны выполняться в виртуальном методе х класса А. И тогда этот метод можно было бы вызывать из любого производного класса.
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение