Domanda

Prima di tutto stabilire questo.

ho

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

è valida per chiamare

Bar.StaticMethod();

???

Se è così, cerchiamo di espandere dell'esempio precedente:

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!!!!");
  }
}

Come faccio a costruire StaticMethod nella classe base in modo che posso usare VirtualMethod da classi derivate? Sembra che ho avuto troppo poco / troppa caffeina oggi e nulla viene in mente qui.

Hm, so che non posso richiamare il metodo esempio dal metodo statico. Quindi la domanda viene a questo:

Posso creare un'istanza della classe derivata da metodo statico della classe base. Utilizzando qualcosa come:

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

ho inventato nuova parola chiave, derivata, per scopo illustrativo.

A proposito, io non favorire la riflessione soluzione basata qui!

È stato utile?

Soluzione

Per invocare un metodo non statica da un metodo statico, è necessario fornire un esempio come il metodo statico non è tenuto a this

Poi, dopo la modifica, la tua domanda mi ha fatto pensare del modello modello curiosamente ricorrenti in C ++.

Non mi sono mai provato ad usarlo in C #, ma bisogna avere uno sguardo qui , che darebbe qualcosa di simile:

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 stampa il messaggio "virtual from static!!!!" previsto nella console.

Altri suggerimenti

  

è valida per chiamare Bar.StaticMethod (); ???

Si, chiamando Bar.StaticMethod è legale, e semplicemente si comporta come se hai chiamato Foo.StaticMethod.

  

Posso creare un'istanza della classe derivata da metodo statico della classe di base.

OK, credo di aver capito quello che vuoi. Si desidera chiamare un metodo statico e lo hanno creare un'istanza di una classe derivata ARBITRARIA, e quindi chiamare un metodo su quella classe, sì?

Utilizzare i farmaci generici.

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ì?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top