我有一个类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
中的对象,因为它会创建一个新对象。
如果我的type cast
是抽象的,我可以使用CMyDataClass
。但如果我把它作为抽象,我就不能填充lstMyDataList
如下(对象类型未知)。
List<CMyDataClass> lstMyDataList = new List<CMyDataClass> { new CMyDataClass("", "", 1), new CMyDataClass("", "", 2) };
如何根据哪个类填充对象将对象强制转换为child
类型?
先谢谢。
答案 0 :(得分: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();
}
}
//....
答案 1 :(得分:0)
如何将CMyDataClass包装在另一个类中,并将新类的实例放在列表框中?然后,您可以在内部使用COne或CTwo实例,具体取决于使用哪种方法填充它。