簡體   English   中英

基於類型返回特定對象的通用工廠方法

[英]Generic factory method to return specific object based on type

我有以下基類:

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,但是當然,如​​果我創建接口,我也需要使它通用,因為返回類型就像那樣我怎樣才能以優雅的方式處理這種情況?

此設計還有其他選項,但由於我們不知道您嘗試做什么的內部,我的答案將僅基於所呈現的代碼。 您可以像這樣重寫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>();

我認為ItemComponent應該有一個抽象的SaveItem函數,然后CellRow應該實現SaveItem函數。

所有ItemComponentSaver<TType>需要做的是調用item.SaveItem CellSaver不需要單獨的CellSaverRowSaver類。

編輯:事實上,除非你在SaveItem之外做更多的事情,我根本不認為需要一個ItemComponentSaver<TType> 也許我錯過了什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM