[英]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");
}
}
現在的問題是:如果COne
或CTwo
填充了數據對象,它將返回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.