Re: Классы в С#
От: egortal Эстония  
Дата: 23.02.05 15:09
Оценка:
Здравствуйте, 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();
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.