如何将多态变量更改为子类型?

时间:2015-03-30 00:31:28

标签: c#

我正在制作一个使用多态但在列表中的程序。现在当我使用列表中的值时,我已经通过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的类中,因此我无法访问任何子属性,因为它不知道它是一个子级。有没有办法让这个对象成为一个孩子?该列表必须使用多态,因为有多个不同的子类需要在一个列表中。

4 个答案:

答案 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上定义虚拟成员。