2012-04-16 4 views
1

Я могу вызвать метод родительского класса, используя base.virtualParentMethod(). Но как я могу вызвать метод в родительском-родительском классе без создания его объекта в следующем сценарии.Как вызвать метод родительского класса без создания его объекта

class A 
    { 
     public virtual void virtualParentMethod() 
     { 
      Console.WriteLine("A"); 
     } 
    } 
    class B : A 
    { 
     public override void virtualParentMethod() 
     { 
      Console.WriteLine("B"); 
     } 
    } 
    class C : B 
    { 
     public override void virtualParentMethod() 
     { 
      //base.virtualParentMethod(); 
      //This is where I want to invoke the method of A 
      //So that out Will be : A 
     } 
    } 
+0

Если вам нужно это сделать, то вам нужно реорганизовать это. У вас, похоже, есть несоответствие между вашей моделью наследования и желаемым поведением. – Pete

+0

duplicate - http://stackoverflow.com/questions/438939/is-there-any-way-to-call-the-parent-version-of-an -overridden-method-c-net – scibuff

+0

Если вы действительно хотите это сделать, возможно, вам стоит подумать об изменении дизайна ... –

ответ

2

Вы не можете выбрать, какую версию производного метода для запуска с использованием синтаксиса base. Единственный способ запустить конкретный метод - создать экземпляр версии A внутри C, который может быть использован для этого метода (в основном, real экземпляр A).

Однако я лично этого не сделал. Это указывает на проблему дизайна с вашей цепочкой наследования.

Если вам необходимо убедиться, что C пробегов A, почему не наследуют A от C - C : A.

0

Вы просто не можете, потому что это сущность Virtual Method Table, поэтому ключевое слово virtual и его переопределение. Адрес метода invokation будет рассмотрен с соответствующей таблицы виртуальных методов real.

0

Вы не можете. используя base.MethodName всегда будет называть ближайшую реализацию вверх по иерархии, и вы не можете пройти это без явного объявления метода, который можно назвать

также стоит отметить, что если вы окажетесь в ситуации, когда хотите Чтобы сделать это, у вас есть недостаток дизайна.

4

Если вам нужна родительская функциональность не прямые дети родителя, то вы должны переместить эту функциональность отдельного метода:

class A 
{ 
    public virtual void VirtualParentMethod() 
    { 
     Foo(); 
    } 

    protected void Foo() 
    { 
     Console.WriteLine("A"); 
    } 
} 
class B : A 
{ 
    public override void VirtualParentMethod() 
    { 
     Console.WriteLine("B"); 
    } 
} 
class C : B 
{ 
    public override void VirtualParentMethod() 
    {   
     Foo(); 
    } 
} 

UPDATE

считает также:

  • наследующую C непосредственно от A
  • изменение порядка наследования, то есть B из C
  • извлекая это поведение к другому объекту
0

Вы уже создали экземпляр A, путем создания экземпляра C (как C: B, B: А), так что есть способ вы можете сделать это с небольшой модификацией. Теперь, не указав, хорошая идея это или нет;

Если вы используете ключевое слово «новое» вместо переопределения в реализации производного метода, вы можете вызвать базовую реализацию метода напрямую, минуя реализацию промежуточного класса, путем литья объекта в тип, который вам нужен использовать так;

class A 
{ 
    public virtual void virtualParentMethod() 
    { 
     Console.WriteLine("A"); 
    } 
} 
class B : A 
{ 
    public new void virtualParentMethod() 
    { 
     Console.WriteLine("B"); 
    } 
} 
class C : B 
{ 
    public new void virtualParentMethod() 
    { 
     // casting this to A will allow you to call the base class implementation 
     ((A)this).virtualParentMethod(); 
    } 
} 

Обратите внимание, что если вы сделаете это изменение, вы ввели изменения в поведении для любых абонентов метода, в зависимости от того, как они относятся к объекту. И если вы попытаетесь применить таким образом в существующей реализации C.virtualParentMethod (объявлено «переопределить»), вы действительно просто вызываете сам метод и попадете в бесконечный цикл.

Или вы могли бы просто пересмотреть свой классный дизайн. :-)

Смежные вопросы