質問

まずこれを確立しましょう。

私は持っている

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

派生クラスから VirtualMethod を使用できるように、基本クラスで StaticMethod を構築するにはどうすればよいですか?今日はカフェインが少なすぎた/多すぎたようで、ここでは何も思い浮かびません。

うーん、静的メソッドからインスタンスメソッドを呼び出すことができないことはわかっています。そこで質問は次のようになります。

基本クラスの静的メソッドから派生クラスのインスタンスを作成できますか。次のようなものを使用します。

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

説明のために、派生した新しいキーワードを発明しました。

ところで、ここでは非反射ベースのソリューションを支持します。

役に立ちましたか?

解決

静的メソッドはバインドされていないため、静的メソッドから非静的メソッドを呼び出すには、インスタンスを提供する必要があります。 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!!!!" コンソールのメッセージ。

他のヒント

  

は有効なBar.StaticMethod()を呼び出すことです。???

はい、呼び出しBar.StaticMethodは合法である、とあなたがFoo.StaticMethodと呼ばれているかのように単純に動作します。

  

私は、基本クラスの静的メソッドから派生したクラスのインスタンスを作成することができます。

OK、私はあなたが欲しいものを理解すると思います。 [はい、静的メソッドを呼び出すと、それは任意の派生クラスのインスタンスを作成していて、そのクラスのメソッドを呼び出したい?

ジェネリックを使用します。

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

はい?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top