1

首先让我们确定这一点。

我有

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

为了说明的目的,我发明了新的关键字,派生。

顺便说一句,我会在这里支持基于非反射的解决方案!

4

2 回答 2

6

要从静态方法调用非静态方法,您必须提供一个实例,因为静态方法未绑定到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!!!!"并在控制台中打印出预期的消息。

于 2009-12-07T15:41:44.553 回答
4

调用 Bar.StaticMethod(); 是否有效???

是的,调用 Bar.StaticMethod 是合法的,并且行为就像调用 Foo.StaticMethod 一样。

我可以从基类的静态方法创建派生类的实例吗?

好的,我想我明白你想要什么了。您想调用一个静态方法并让它创建一个任意派生类的实例,然后调用该类的方法,是吗?

使用泛型。

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

是的?

于 2009-12-07T15:48:32.660 回答