Вызов дочерних виртуальных методов из статического метода - PullRequest
1 голос
/ 07 декабря 2009

Сначала давайте установим это.

У меня есть

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

действительно ли звонить

Bar.StaticMethod();

???

Если это так, давайте расширим предыдущий пример:

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

Как мне создать StaticMethod в базовом классе, чтобы я мог использовать VirtualMethod из производных классов? Кажется, сегодня у меня было слишком мало / слишком много кофеина, и здесь мне ничего не приходит в голову.

Хм, я знаю, что не могу вызвать метод экземпляра из статического метода. Таким образом, вопрос приходит к этому:

Могу ли я создать экземпляр производного класса из статического метода базового класса. Используя что-то вроде:

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

Я изобрел новое ключевое слово, производное, для иллюстрации.

Кстати, я предпочту решение, не основанное на отражении, здесь!

Ответы [ 2 ]

6 голосов
/ 07 декабря 2009

Чтобы вызвать нестатический метод из статического метода, вы должны предоставить экземпляр, так как статический метод не привязан к this

Затем, после вашего редактирования, ваш вопрос заставил меня задуматься о любопытно повторяющемся шаблоне в C ++.

Я никогда не пытался использовать его в C #, но вы посмотрели здесь , что даст вам что-то вроде:

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();
    }
  }
}

И выводит на консоль нужное сообщение "virtual from static!!!!".

4 голосов
/ 07 декабря 2009

Допустимо ли вызывать Bar.StaticMethod (); ???

Да, вызов Bar.StaticMethod является законным и просто ведет себя так, как будто вы вызвали Foo.StaticMethod.

Могу ли я создать экземпляр производного класса из статического метода базового класса.

ОК, я думаю, я понимаю, что вы хотите. Вы хотите вызвать статический метод и заставить его создать экземпляр производного класса ARBITRARY, а затем вызвать метод этого класса, да?

Используйте дженерики.

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>();

Да

...