簡體   English   中英

抽象工廠模式

[英]Abstract factory pattern

我有一個類CMyDataClass來存儲數據,它具有三個成員變量和兩個構造函數,例如

public class CMyDataClass
{
    public String strIndex, strName;
    public int nType;
    public CMyDataClass()
    {
        strIndex = "";
        strName = "";
        nType = 0;
    }
    public CMyDataClass(String ind, String name, int ty)
    {
        strIndex = ind;
        strName = name;
        nType = ty;
    }
}

在另一個類( CMain )中,我有一個List<CMyDataClass> ,其中包含兩個對象,例如

 List<CMyDataClass> lstMyDataList = new List<CMyDataClass> { new CMyDataClass("", "", 1), 
                                                             new CMyDataClass("", "", 2) };

我有兩個子類,它們繼承了CMyDataClass ,每個子類都包含一個填充數據結構的函數。

子類中的函數將基於ntype填充對象。

這是我的孩子班

//Class One

class COne : CMyDataClass
{
    public static bool FillData(CMyDataClass objCMDClass)
    {
        if (objCMDClass.nType == 1)
        {
            objCMDClass.strIndex = "Index-One";
            objCMDClass.strName = "One";
            return true;
        }
        return false;
    }
}



//Class Two

class CTwo : CMyDataClass
{
    public static bool FillData(CMyDataClass objCMDClass)
    {
        if (objCMDClass.nType == 2)
        {
            objCMDClass.strIndex = "Index-Two";
            objCMDClass.strName = "Two";
            return true;
        }
        return false;
    }
}

CMain類中,我執行子類函數,例如

 public void Func()
    {
        for (int index = 0; index < lstMyDataList.Count; index++)
        {
            if (COne.FillData(lstMyDataList[index]) == false)
                if (CTwo.FillData(lstMyDataList[index]) == false)
                    MessageBox.Show("No data found");
        }
    }

現在的問題是:如果COneCTwo填充了數據對象,它將返回CMyDataClass類型的對象。 但是我需要子類的對象,即,如果COne填充了Object,則該對象應為COne類型,或者如果CTwo則該對象應為CTwo對象。

所以我改變了我的Child

class COne : CMyDataClass
  {
    public static bool FillData(CMyDataClass objCMDClass)
    {
        if (objCMDClass.nType == 1)
        {
            COne obj=new COne();
            obj.strIndex = "Index-One";
            obj.strName = "One";
            objCMDClass=obj
            return true;
        }
        return false;
    }
}

但這不會將對象填充到lstMyDataList ,因為它會創建一個新對象。

如果我的CMyDataClass是抽象的,我可以使用type cast CMyDataClass 但是,如果我將其抽象,則無法按如下方式填充lstMyDataList (對象類型unknown)。

 List<CMyDataClass> lstMyDataList = new List<CMyDataClass> { new CMyDataClass("", "", 1), new CMyDataClass("", "", 2) };

如何根據哪個類填充對象將對象轉換為child類型?

謝謝。

您不能將對象轉換為子類型,因為它不是子類型的實例。 您不使用繼承,而是創建CMyDataClass實例,並根據參數以不同的方式初始化它們。

很難說出您到底需要什么或想要什么,並且鑒於這一點,目前還不清楚是否需要繼承。 但是如果這是您想要的工廠,則可能是這樣的:

    public class CMyDataClass
    {
        // ...snipped definition...
        public CMyDataClass(int type)
        {
            nType = type;
        }        

        public virtual void FillData()
        {
        }

        static public CMyDataClass Create(int type)
        {
            switch (type)
            {
                case 1:
                   return new COne(type);
                case 2:
                   return new CTwo(type);
                default:
                   return null // or throw an exception, whatever is appropriate
            }
        }
    }

    public class COne : CMyDataClass
    {
         public COne(int type)
             : base(type)
         {
         }

         public override void FillData()
         {
              strIndex = "Index-One";
              strName = "One";             
         } 
    }

    public class CTwo : CMyDataClass
    {
         public CTwo(int type)
             : base(type)
         {
         }

         public override void FillData()
         {
              strIndex = "Index-Two";
              strName = "Two";             
         } 
    }

//....
    List<CMyDataClass> lstMyDataList = new List<CMyDataClass> { CMyDataClass.Create(1), 
                                                                 CMyDataClass.Create(2) }
//....

//....
    public void Func()
    {
        for (int index = 0; index < lstMyDataList.Count; index++)
        {
            lstMyDataList[index].FillData();
        }
    }
//....

將CMyDataClass包裝在另一個類中,然后將新類的實例放在列表框中,該怎么辦? 然后,可以使用內部填充方法來填充COne或CTwo的實例。

暫無
暫無

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

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