2011-01-27 114 views
2

我有一個類,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 I類執行類似

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填充了對象,那麼對象應該是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。但是,如果我把它作爲抽象,我不能填充lstMyDataList如下(對象類型未知)。

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

如何將對象轉換爲child類型,在此基礎上類填充物?

非常感謝。

回答

5

您不能將對象轉換爲子類型,因爲它不是子類型的實例。 您沒有使用繼承,您正在創建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(); 
     } 
    } 
//.... 
0

約包裹CMyDataClass另一個類裏面是什麼,並把新的類的實例列表框中裏面?然後,您可以在內部使用COne或CTwo的實例,具體取決於使用哪種方法來填充它。