所以我有一个类型为Account的数组,它由Savings和Checking组成,它们来自Account。是否有可能让他们调用他们的方法?编译器只使基类的方法可见,我无法访问派生类中的方法。在这里敲我的头。
答案 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();
}