2012-01-30 18 views
10

¿Es posible que el método a.doStuff() imprima "B hizo cosas" sin editar la clase A? Si es así, ¿cómo lo haría?Llamando al método de clase hijo del padre

class Program 
{ 
    static void Main(string[] args) 
    { 
     A a = new A(); 
     B b = new B(); 

     a.doStuff(); 
     b.doStuff(); 

     Console.ReadLine(); 
    } 
} 

class A 
{ 
    public void doStuff() 
    { 
     Console.WriteLine("A did stuff"); 
    } 
} 

class B : A 
{ 
    public void doStuff() 
    { 
     Console.WriteLine("B did stuff"); 
    } 
} 

Estoy modding a steam game, Terraria. Y no quiero descompilarlo y volver a compilarlo todo, porque eso funcionará con fuerza. Mi programa 'inyecta' en Terraria a través de XNA. Puedo usar los métodos update() y draw() de XNA para modificar algunas cosas. Pero es bastante limitado. Quiero anular los métodos base para modificar más cosas (worldgen, por ejemplo).

Respuesta

13

Sí, si se declara como doStuffvirtual en A y luego override en B.

class A 
{ 
    public virtual void doStuff() 
    { 
     Console.WriteLine("A did stuff"); 
    } 
} 

class B : A 
{ 
    public override void doStuff() 
    { 
     Console.WriteLine("B did stuff"); 
    } 
} 
+0

Como A.doStuff está simplemente para ser reemplazado, debe ser abstracto en lugar de virtual. –

2

Puesto que B es efectivamente una herencia a través de y se sobrecarga el método.

A a = new B(); 
a.doStuff(); 
+2

, por supuesto, se puede hacer por virtual y anular, pero esta es la única manera de hacerlo sin cambiar A como OP –

+0

Gracias, pero tampoco puedo hacer eso. Probablemente debería haber aclarado esto en el OP; Estoy modding un juego de vapor, Terraria. Y no quiero descompilarlo y volver a compilarlo todo, porque eso funcionará con fuerza. Mi programa 'inyecta' en Terraria a través de XNA. Puedo usar los métodos update() y draw() de XNA para modificar algunas cosas. Pero es bastante limitado. Quiero anular los métodos base para modificar más cosas (worldgen, por ejemplo). – user1178494

+0

@ user1178494 ver mi respuesta actualizada con el uso de nuevas palabras clave que podrían ayudar. – VS1

0

El código para la clase A & B que han publicado generará de todos modos por debajo de advertencia del compilador y le pedirá a utilizar la palabra clave new en la clase B, a pesar de que se compilará: La palabra clave nueva se requiere en ' B.doStuff()' porque oculta miembro heredado 'A.doStuff()'

uso method hiding junto con new y virtual palabra clave en Mapper clase y clase B como sigue:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Mapper a = new B(); //notice this line 
     B b = new B(); 

     a.doStuff(); 
     b.doStuff(); 

     Console.ReadLine(); 
    } 
} 

class A 
{ 
    public void doStuff() 
    { 
     Console.WriteLine("A did stuff"); 
    } 
} 

class Mapper : A 
{ 
    new public virtual void doStuff() //notice the new and virtual keywords here which will all to hide or override the base class implementation 
    { 
     Console.WriteLine("Mapper did stuff"); 
    } 
} 

class B : Mapper 
{ 
    public override void doStuff() 
    { 
     Console.WriteLine("B did stuff"); 
    } 
} 
+0

Gracias, pero esto seguirá imprimiendo "A did stuff" cuando se llama a.doStuff(). – user1178494

+0

@ user1178494 He actualizado mi respuesta, por favor pruébela y observe el uso de la clase Mapper (Mediator) entre las clases A y B, vea si resuelve su problema. – VS1

+0

Todavía no funciona, lamentablemente. Gracias de nuevo por ayudarme. – user1178494

Cuestiones relacionadas