派生类的数组,调用方法?

时间:2012-09-11 23:48:44

标签: c# arrays methods base derived

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

3 个答案:

答案 0 :(得分:3)

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

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

如果实例实际上不属于该类型,则会抛出InvalidCastException

答案 1 :(得分:2)

虽然您可以使用强制转换,但由于您不知道数组元素的确切类型,因此会导致大量异常和相当难看的代码来处理它们。

您可以使用以下内容:

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

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

答案 2 :(得分: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 operator非常方便的地方,因为如果转换成功,它只会返回非空值。

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();
}