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

Dan*_*dor 1 c# inheritance static-methods virtual-functions

首先让我们建立这个.

我有

public abstract class Foo
{
  public static void StaticMethod()
  {
  }
}
public class Bar : Foo
{
}
Run Code Online (Sandbox Code Playgroud)

打电话有效吗?

Bar.StaticMethod();
Run Code Online (Sandbox Code Playgroud)

???

如果是这样,让我们​​展开前面的例子:

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!!!!");
  }
}
Run Code Online (Sandbox Code Playgroud)

我应该如何在基类中构造StaticMethod,以便从派生类中使用VirtualMethod?我今天的咖啡因似乎太少/太多了,这里没有任何想法.

嗯,我知道我不能从静态方法调用实例方法.所以问题就出现了:

我可以从基类的静态方法创建派生类的实例.使用类似的东西:

  public static void StaticMethod()
  {
    derived d=new derived();
    d.VirtualMethod();
  }
Run Code Online (Sandbox Code Playgroud)

为了说明的目的,我发明了新的关键字.

顺便说一句,我会赞成基于非反思的解决方案!

Gre*_*osz 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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

"virtual from static!!!!"在控制台中打印出预期的消息.