我正在制作一个使用多态但在列表中的程序。现在当我使用列表中的值时,我已经通过if语句确定了哪个是child和parent,但问题是我无法访问任何子属性。有什么建议? (以下示例代码)
//In Class one
public List<Parent> parent;
parent.Add(new Child());
//In Class two
if (parent[0] is Child)
{
//treats it as parent
Console.WriteLine(parent[0].name());
}
在上面的代码中,属性名称是public,但在child的类中,因此我无法访问任何子属性,因为它不知道它是一个子级。有没有办法让这个对象成为一个孩子?该列表必须使用多态,因为有多个不同的子类需要在一个列表中。
答案 0 :(得分:1)
我会使用as
关键字。这是一个安全的强制转换,在无法进行强制转换时返回null。
Child child = obj as Child;
if (child!=null)
{
child.childMethod();
}
答案 1 :(得分:0)
使用继承和多态,指向Child对象的Parent对象引用只能在运行时访问Parent方法。但是它可以被强制转换并调用Child方法。 ((Child) obj).childMethod();
答案 2 :(得分:0)
您可以通过强制转换来获取子方法,如下所示:
//In Class one
public List<Parent> parent;
parent.Add(new Child());
//In Class two
Child parentAsChild = parent[0] as Child;
if (parentAsChild != null)
{
Console.WriteLine(parentAsChild.name());
}
as
运算符执行&#34;防御&#34;如果parent[0]
无法转换为Child
对象,则返回null。
虽然要小心 - 你通过这样做来规避多态性的目的。多态性的全部意义在于你不必进行类型检查和转换 - 子类应该覆盖任何与父级不同的行为。
答案 3 :(得分:0)
在检查其类型后将对象强制转换为Child
:
//In Class one
public List<Parent> parent;
parent.Add(new Child());
//In Class two
if (parent[0] is Child)
{
var child = (Child) parent[0];
Console.WriteLine(child.name());
}
或在检查其类型之前将对象强制转换为Child
:
//In Class one
public List<Parent> parent;
parent.Add(new Child());
//In Class two
var child = parent[0] as Child;
if (child != null)
{
//treats it as parent
Console.WriteLine(child.name());
}
应尽可能避免这种铸造。考虑使用界面来定义您需要使用的API,或者在Parent
上定义虚拟成员。