Классы в С#
От: Mr. Woland  
Дата: 23.02.05 07:40
Оценка:
Есть приблизительно такой код
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();
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();
Классы в С#
От: Аноним  
Дата: 23.02.05 07:58
Оценка:
Я бы вообще вынес в отдельный метод те действия, которые должны выполняться в виртуальном методе х класса А. И тогда этот метод можно было бы вызывать из любого производного класса.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.