gpt4 book ai didi

c# - 在不同子类的 ArrayList 中访问正确的函数

转载 作者:太空宇宙 更新时间:2023-11-03 18:58:57 26 4
gpt4 key购买 nike

假设我有以下三个类:

父类:

public class ParentClass {
public void foo() {
Debug.Log("Parent called!");
}
}

第一个子类:

public class ChildOne : ParentClass {
public new void foo() {
Debug.Log("Child one called!");
}
}

第二个 child 类(class):

public class ChildTwo : ParentClass {
public new void foo() {
Debug.Log("Child two called!");
}
}

在第四节课中,我有一个包含多个 ChildOne 和 ChildTwo 对象的 ArrayList。 ArrayList 不包含任何其他类型的对象。

如何访问子对象的 foo() 函数?

public class Example {
public void someFunction() {
//...

ArrayList children = new ArrayList();
children.add(new ChildOne());
children.add(new ChildTwo());

children[0].foo(); //here I want to call the foo() function of the ChildOne object
children[1].foo(); //here I want to call the foo() function of the ChildTwo object

//...
}
}

转换到 ParentClass 不起作用,而且我无法转换到其中一个子类,因为我不知道每个元素的类型。

最佳答案

如果可以,您可以使用多态性而不是隐藏父级的 foo 函数。

为了实现这个结果,我们可以转换父类,使 foo 方法成为虚拟,这样我们就可以在子类中覆盖它:

public class ParentClass {
public virtual void foo() {
Debug.Log("Parent called!");
}
}

然后在子类中,我们将 new 关键字替换为 override 关键字:

public class ChildOne : ParentClass {
public override void foo() {
Debug.Log("Child one called!");
}
}

public class ChildTwo : ParentClass {
public override void foo() {
Debug.Log("Child two called!");
}
}

使用 ArrayList,您可以这样调用 foo 方法:

ArrayList children = new ArrayList();
children.Add(new ChildOne());
(children[0] as ParentClass).foo(); // will display "Child one called!"

请注意,children[0] 返回一个对象。您必须将此对象转换为 ParentClass 才能调用 foo 方法。

我最后的建议是使用 List 而不是 ArrayList。 List 是强类型的(您不必强制转换任何内容)并且速度更快,因为没有装箱/拆箱。现在没有太多理由(如果有的话)使用 ArrayList。

var children = new List<ParentClass>();
children.Add(new ChildOne());
children[0].foo(); // will display "Child one called!"

关于c# - 在不同子类的 ArrayList 中访问正确的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39089582/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com