-1

汎用クラスに静的関数を追加したい多くのクラスを介して継承される抽象 C# クラスがあります。

public abstract class A<T>: where T
{
    protected A()
    {
        // setup class A
    }

    public List<T> GetResult()
    {
        return new List<String>();
    }
}

public class B : A<String>
{
    public string FooBar()
    {
        // do something
    }
}

ここで、抽象クラス A に静的クラスを追加したいと思います

pulic static List<T> GetResults()
{
    var foo = new A();
    return foo.GetResult();
}

ここで、継承されたクラスを介して新しい静的関数を呼び出したいと思います

B.GetResults();

抽象クラスでこのようなことは可能ですか?

4

2 に答える 2

3

多くの点で無効なコードを指定したため、質問が不明確です。ただし、抽象ジェネリック基本クラスで静的メソッドを作成し、派生型の名前を「介して」呼び出すことができます...しかし、そうするのは特に役に立ちません。

したがって、このコードは機能します:

using System;

public abstract class A<T> where T : new()
{
    public static T CreateInstance()
    {
        return new T();
    }
}

public class B : A<int>
{
}

class Test
{
    static void Main()
    {
        Console.WriteLine(B.CreateInstance());
    }
}

...しかし、への呼び出しB.CreateInstance()は次とまったく同じです:

A<int>.CreateInstance();

...そして実際、それがコンパイルされたものです。

一般に、派生クラスを介して静的メンバーにアクセスすることは強くお勧めしません。同様に、 を書くのではなく、書くASCIIEncoding.ASCIIことをお勧めEncoding.ASCIIします。何を使用しているかがより明確になります。

これが実際に問題を解決するかどうかは別の問題です。達成しようとしていることを実際に説明しておらず、達成しようとしていた方法だけを説明しているため、不明です

于 2012-11-20T12:44:10.960 に答える
1

これを試すことができます:

public abstract class A<T, TSelf> // TSelf name just to clarify here
    where TSelf : A<T, TSelf>, new()
{
    public abstract List<T> GetResult();

    public static List<T> GetResults()
    {
        var foo = new TSelf();
        return foo.GetResult();
    }
}

public class B : A<String, B>
{
    public override List<String> GetResult()
    {
        // Do something....
    }
}

これで、次のように呼び出すことができます。

List<String> results = B.GetResults();
于 2012-11-20T12:46:57.640 に答える