从静态方法调用后代虚方法

时间:2009-12-07 15:40:11

标签: c# inheritance static-methods virtual-method

首先让我们建立这个。

我有

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 个答案:

答案 0 :(得分:6)

要从静态方法调用非静态方法,必须提供实例,因为静态方法未绑定到this

然后,在您编辑之后,您的问题让我想到了C ++中的curiously recurring template pattern

我从未尝试过在C#中使用它,但你看看here,这会给你类似的东西:

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!!!!"消息。

答案 1 :(得分:4)

  

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