1

C#の静的抽象メソッドに代わるものが必要です:

// fantasy code
abstract public class BaseClass
{
    static abstract public void RequiredStaticMethod();
}

私には2つの条件がありRequiredStaticMethodます:

  1. すべての派生クラスはそれを実装する必要があります(コンパイラーによって強制されます)。
  2. クラスのインスタンスなしで使用可能である必要があります。つまり、DerivedClass.RequiredStaticMethod()動作する必要があります。

これを達成するための最良の方法は何ですか?

4

2 に答える 2

3

コンパイル時に検証するためにできることは何もありません。ただし、リフレクションを使用してメソッドを呼び出す場合 (したがって、ポリモーフィズムは必要ありません) 、すべての具体的な派生クラスが特定のメソッドを実装する必要があることを文書化してから、アセンブリを精査する単体テストを記述できます。すべての派生型とそれらが準拠していることを確認します。

これはコンパイル時のチェックほど優れたものではありませんが、関連するすべてのアセンブリを制御でき、単体テストを十分に頻繁に実行していると仮定すると、それほど苦労することはありません。

于 2013-03-14T16:29:29.450 に答える
1

これは C# では実行できません。代わりに、抽象インスタンス メソッドとシングルトン パターンを使用すると役立つ場合があります。

abstract public class BaseClass
{
    abstract public void RequiredStaticMethod();
}

sealed class Subclass : BaseClass
{
    public static readonly Subclass Instance = new Subclass();

    public void RequiredStaticMethod() {}    
}

達成しようとしている根本的な問題の詳細な説明を追加したい場合があります。一般に、抽象クラスを使用して、代わりに抽象型を使用するようにすることで、実際の実装から消費者を分離します。ただし、これは明らかに静的メンバーでは実行できません。ジョンがコメントしたように、あなたがどのように消費するつもりなのか、BaseClassまだわかりません.

インターフェースを使用して、リフレクションを介してすべての実装タイプを見つけることもできます。これにより、型指定された iterable が生成IFooされ、インスタンスにバインドされた方法でメソッドが呼び出されます。

class Program
{
    public static void Main()
    {
        var classes = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.GetInterface("IFoo") != null);
        foreach(var foo in classes.Select(c => Activator.CreateInstance(c)).Cast<IFoo>())
        {
            foo.RequiredNonStaticMethod();
        }
    }
}

public interface IFoo
{
    void RequiredNonStaticMethod();
}

public class FooImpl : IFoo
{
    public void RequiredNonStaticMethod()
    {
        Console.WriteLine("Foo");
    }
}
于 2013-03-14T16:17:24.560 に答える