Pregunta

En primer lugar vamos a establecer esto.

Tengo

public abstract class Foo
{
  public static void StaticMethod()
  {
  }
}
public class Bar : Foo
{
}

¿es válido para llamar

Bar.StaticMethod();

???

Si es así, vamos a ampliar ejemplo anterior:

public abstract class Foo
{
  public static void StaticMethod()
  {
  }
  public abstract void VirtualMethod();
}
public class Bar : Foo
{
  public override void VirtualMethod()
  {
     Trace.WriteLine("virtual from static!!!!");
  }
}

¿Cómo debo construir StaticMethod en la clase base para que pueda utilizar VirtualMethod de las clases derivadas? Parece que tenía muy poco el exceso de cafeína / hoy y nada viene a la mente aquí.

Hm, sé que no puedo invocar método de instancia del método estático. Así que la pregunta viene a esto:

¿Puedo crear instancia de clase derivada de método estático de la clase base. Mediante el uso de algo como:

  public static void StaticMethod()
  {
    derived d=new derived();
    d.VirtualMethod();
  }

he inventado nueva palabra clave, derivada, con el propósito de ilustración.

Por cierto, voy a favorecer el no-reflexión solución basada aquí!

¿Fue útil?

Solución

Para invocar un método no estático de un método estático, tiene que proporcionar una instancia como el método estático no está obligado a this

A continuación, después de su edición, su pregunta me hizo pensar en el patrón plantilla curiosamente recurrente en C ++.

Nunca tratado a mí mismo para utilizarlo en C #, pero tienes que echar un vistazo aquí , lo que le daría algo como:

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;

namespace ConsoleApplication3
{
  public abstract class Foo<T> where T : Foo<T>, new()
  {
    public static void StaticMethod()
    {
      T t = new T();
      t.VirtualMethod();
    }

    public abstract void VirtualMethod();
  }

  public class Bar : Foo<Bar>
  {
    public override void VirtualMethod()
    {
      System.Console.WriteLine("virtual from static!!!!");
    }
  }
  class Program
  {
    static void Main(string[] args)
    {
      Bar.StaticMethod();
    }
  }
}

e imprime el mensaje "virtual from static!!!!" previsto en la consola.

Otros consejos

  

es válido para llamar Bar.StaticMethod (); ???

Sí, llamando Bar.StaticMethod es legal, y simplemente se comporta como si usted llama Foo.StaticMethod.

  

¿Puedo crear instancia de clase derivada de método estático de la clase base.

OK, creo que entiendo lo que quieres. Al que desea llamar a un método estático y tienen que crear una instancia de una clase arbitraria según los resultados, y luego llamar a un método de esa clase, ¿verdad?

Use los genéricos.

abstract class Foo 
{
    public static void DoBlah<T>() where T : Foo, new()
    {
        T t = new T();
        t.Blah();
    }
    public abstract void Blah();
}
class Bar : Foo
{ 
    public Bar() {}
    public override void Blah() {}
}
...
Foo.DoBlah<Bar>();

Sí?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top