【问题标题】:Generic factory method to return specific object based on type基于类型返回特定对象的通用工厂方法
【发布时间】:2013-10-15 21:40:55
【问题描述】:

我有以下基类:

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
        }
    }

现在,我知道在某些时候我需要创建这些东西,所以有不可避免的“switch”之类的声明,我为此创建了一个工厂:

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,但是当然,如​​果我创建接口,我也需要将其设为泛型,因为返回类型是这样的 我该如何优雅地处理这种情况??

【问题讨论】:

    标签: c# oop generics switch-statement factory-pattern


    【解决方案1】:

    此设计还有其他选择,但由于我们不知道您尝试做什么的内部结构,我的回答将仅基于提供的代码。 您可以像这样重写您的 GetSaver 方法:

         public static ItemComponentSaver<T> GetSaver<T>() where T : ItemComponent
         {
             if (typeof(T) == typeof(Cell))
                 return new CellSaver() as ItemComponentSaver<T>;
             else if (typeof(T) == typeof(Row))
                 return new RowSaver() as ItemComponentSaver<T>;
             else
                 return null;//here you can return what u need in case no types match.
         }
    

    这样叫……

    ItemComponentSaver<Row> saver = ItemComponentSaverFactory.GetSaver<Row>();
    

    【讨论】:

    • 嗨特里,谢谢你的回答,我不知道我怎么没试过。顺便说一句,我想知道还有哪些其他好的设计选择是好的,至少从“哲学”的角度来看,它们可能会适应我当前的代码,学习总是很好
    【解决方案2】:

    我认为ItemComponent应该有一个抽象的SaveItem函数,然后CellRow应该实现SaveItem函数。

    所有ItemComponentSaver&lt;TType&gt; 需要做的就是致电item.SaveItem。根本不需要单独的 CellSaverRowSaver 类。

    编辑:事实上,除非你在SaveItem 之外做更多的事情,否则我根本不认为需要ItemComponentSaver&lt;TType&gt;。也许我错过了什么。

    【讨论】:

    • 感谢大卫,这是我最初的方法,但是,由于整个保存过程最终使用了一些 DAL 类,我无法直接从域模型(单元格、行)访问它们,并且这就是我采用“保护类”方法的原因,这最终将成为为此目的的合作者。
    猜你喜欢
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 2021-07-26
    相关资源
    最近更新 更多