我有一个类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填充了这个对象,那么这个对象应该是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类型?
提前谢谢你。
发布于 2011-01-27 19:45:02
您不能将对象强制转换为子类型,因为它不是子类型的实例。您不是在使用继承,而是在创建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();
}
}
//....发布于 2011-01-27 19:48:07
如何将CMyDataClass包装在另一个类中,并将新类的实例放在列表框中?然后,您可以在内部拥有COne或CTwo的实例,这取决于填充它的方法。
https://stackoverflow.com/questions/4815643
复制相似问题