Tho*_*eld 2 c# inheritance abstract-class design-patterns
我有一个类,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;
}
}
Run Code Online (Sandbox Code Playgroud)
在另一个类(CMain
)中,我有一个List<CMyDataClass>
包含两个对象的类
List<CMyDataClass> lstMyDataList = new List<CMyDataClass> { new CMyDataClass("", "", 1),
new CMyDataClass("", "", 2) };
Run Code Online (Sandbox Code Playgroud)
我有两个继承的子类,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;
}
}
Run Code Online (Sandbox Code Playgroud)
在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");
}
}
Run Code Online (Sandbox Code Playgroud)
现在问题是:if 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;
}
}
Run Code Online (Sandbox Code Playgroud)
但这不会填充对象lstMyDataList
,因为它会创建一个新对象.
type cast
如果我CMyDataClass
是抽象的,我可以使用.但如果我把它作为抽象我不能填写lstMyDataList
如下(对象类型未知).
List<CMyDataClass> lstMyDataList = new List<CMyDataClass> { new CMyDataClass("", "", 1), new CMyDataClass("", "", 2) };
Run Code Online (Sandbox Code Playgroud)
如何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();
}
}
//....
Run Code Online (Sandbox Code Playgroud)