4

所以我有一个 Account 类型的数组,它由从 Account 派生的 Savings 和 Checking 组成。是否有可能让这些调用他们的方法?编译器只使基类中的方法可见,我无法访问派生类中的方法。把我的头撞到这里的墙上。

4

3 回答 3

4

您需要将数组中的元素转换为派生类:

((Checking)someArray[42]).Whatever();

如果实例实际上不是该类型,这将抛出一个InvalidCastException.

于 2012-09-11T23:50:55.177 回答
2

尽管您可以使用强制转换,但由于您不知道数组元素的确切类型,这将导致一堆异常和一个相当丑陋的代码来处理它们。

你可以使用类似的东西:

Saving s = array[i] as Saving;
if(s != null)
{
   s.SomeSavingMethod();
}
else
{
   Checking c = array[i] as Checking;
   if(c != null)
      c.SomeCheckingMethod();
}

然而,猜测类型并相应地调用方法,通常被认为是一个糟糕的设计。这听起来像是虚拟方法的情况,或者这些东西首先不应该在同一个数组中。

于 2012-09-12T00:03:29.357 回答
0

基本上有两种方法可以用来完成您似乎正在寻找的功能。

第一个并且可以说是最好的(对于您描述的情况)是声明所有这些类都实现的公共接口。

public interface IWorker
{
    void DoWork();
}

public class A : IWorker
{
    public void DoWork()
    {
        // TODO: Implement this method
        throw new NotImplementedException();
    }
}

public class B : IWorker
{
    public void DoWork()
    {
        // TODO: Implement this method
        throw new NotImplementedException();
    }
}

第二个是检测类型并在它支持的情况下调用该方法。沿着这些思路。这是AS 运算符非常方便的地方,因为如果转换成功,它只会返回非空值。

List<object> workers = new List<object>() { new A(), new B() };
foreach (object itm in workers)
{
    ClassThatSupportsDoWork obj = itm as ClassThatSupportsDoWork;
    if (obj != null)
        obj.DoWork();
}
于 2012-09-12T00:05:45.610 回答