1

私は次の基本クラスを持っています:

public abstract class ItemComponentSaver<TType> : where TType : ItemComponent
{
    public abstract bool SaveItem(TType item, object objectRowInTableFromEF, PropertyInfo columnTypeProperty);
}

これには、私がサポートするタイプごとにいくつかの子もあります。私の考えは、それらをポリモーフィックに使用して、後で保存操作を実行することです。たとえば、

    public class CellSaver : ItemComponentSaver<Cell>
    {
        public override bool SaveItem(Cell item, object objectRowInTableFromEF, PropertyInfo columnTypeProperty)
        {
                // code here
        }
    }

さて、ある時点でこのようなものを作成する必要があることを知っているので、避けられない「スイッチ」のようなステートメントがあります。このためのファクトリを作成しました。

public static class ItemComponentSaverFactory
{
    public static ItemComponentSaver<T> GetSaver<T>(ItemComponent entity) where T : ItemComponent
    {
        if (entity is Cell)
            return (ItemComponentSaver<T>)new CellSaver();

        if (entity is Row)
            return (ItemComponentSaver<T>)new RowSaver();
    }

}

問題は、ジェネリックであるため、CellSaver を戻り値の型にキャストできないことです。クラスtpeの代わりにインターフェイスを返すこともできますが、もちろん、インターフェイスを作成する場合は、戻り値の型がそのようなものであるため、それをジェネリックにする必要があります。

4

2 に答える 2

1

ItemComponent抽象SaveItem関数が必要だと思います。Cellそして、関数Rowを実装する必要がありSaveItemます。

ItemComponentSaver<TType>必要なのは、 を呼び出すことだけですitem.SaveItem。個人CellSaverRowSaverクラスは一切必要ありません。

編集:実際、 の外SaveItemでもっと何かをしない限り、 の必要性はまったくありませんItemComponentSaver<TType>。多分私は何かが足りない。

于 2013-10-15T22:16:12.440 に答える