20

私がしたいのは、クラスItemの子クラスが静的メソッドを実装していることを確認することだけであり、実行時エラーを回避するためにコンパイル時にこれをチェックしたいと考えています。

静的メソッドを持つ抽象クラスは機能していないようです:

エラー: 静的メンバーをオーバーライド、仮想、または抽象としてマークすることはできません

public abstract class Item
{
    public static abstract Item GetHistoricalItem(int id, DateTime pastDateTime);
}

public class Customer : Item
{
    public static override Customer GetHistoricalItem(int id, DateTime pastDateTime)
    {
        return new Customer();
    }
}

public class Address : Item
{
    public static override Address GetHistoricalItem(int id, DateTime pastDateTime)
    {
        return new Address();
    }
}

インターフェイスも機能していないようです:

エラー: 顧客はインターフェイス メンバー GetHistoricalItem() を実装していません

public class Customer : Item, HistoricalItem
{
    public static Customer GetHistoricalItem(int id, DateTime pastDateTime)
    {
        return new Customer();
    }
}

public class Address : Item, HistoricalItem
{
    public static Address GetHistoricalItem(int id, DateTime pastDateTime)
    {
        return new Address();
    }
}

interface HistoricalItem
{
    Item GetHistoricalItem();
}

継承クラスが特定のシグネチャを持つ静的メソッドを実装しているかどうかをコンパイラにチェックさせるための回避策はありますか?

4

5 に答える 5

20

私があなたのシナリオのために考え出した回避策があります:

public class Customer : Reference<Customer>, IHistoricalItem
{
}

public class Address : Reference<Address>, IHistoricalItem
{
}

public interface IHistoricalItem
{
}

public class Reference<T> where T : IHistoricalItem, new()
{
    public static T GetHistoricItem(int id, DateTime pastDateTime)
    {
        return new T();
    }
}

お役に立てれば!!

于 2009-12-15T09:14:38.587 に答える
3

クライアントに静的メソッドの実装を強制するのは意味がありません。静的メソッドは「不変」です。(おそらく、それらを説明するより良い方法がありますが、それが今思いつくことができるすべてです!)

なんらかのオーバーライドが必要な場合は、おそらくシングルトンとインジェクションの何らかの組み合わせを使用して、設計を再検討することを検討します。

于 2009-12-15T09:01:34.727 に答える